68978


以下のプログラムである1つの変数をtrueにして、他の複数の変数を一括でfalseにしたい場合は、どうすればいいでしょうか？  
例えば

[code]

    item02.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            b=true;
            a=false;c=false;d,e,f=false;
        }
    });
    
[/code]

とコードを書くとエラーが出ます。ただ、a,c,d,e,fそれぞれに=falseを書くのは面倒です。

[code]

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Rate2 extends JFrame {
        int n;
        JMenuBar mbar = new JMenuBar();
        JTextField f0 = new JTextField("");
        JButton b0 = new JButton("実行");
    
        JLabel l1 = new JLabel("Input a number and press the button.");
        JMenu menu1 = new JMenu("→to JPY"); 
        JMenu menu2=new JMenu("JPY to→");
        JMenuItem item01 = new JMenuItem("USD to JPY");
        JMenuItem item02 = new JMenuItem("CNY to JPY");
        JMenuItem item03 = new JMenuItem("Euro to JPY");
        JMenuItem item04 = new JMenuItem("JPY to USD");
        JMenuItem item05 = new JMenuItem("JPY to CNY");
        JMenuItem item06 = new JMenuItem("JPY to Euro");
    
        boolean a=false;
        boolean b=false;boolean c=false;boolean d;boolean e;boolean f;
    
        public Rate2() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            setTitle("Please select Currency");
            setLayout(null);
    
            add(f0); f0.setBounds(100, 50, 50, 30);
            add(b0);b0.setBounds(150,50,50,30);
            mbar.add(menu1);mbar.add(menu2);setJMenuBar(mbar);
            menu1.add(item01);menu1.add(item02);menu1.add(item03);
            menu2.add(item04);menu2.add(item05);menu2.add(item06);
    
            add(l1);l1.setBounds(150,140,150,100);
            //pack(); 
            setSize(400, 300);
    
            item01.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    a=true;
                    b=false;
                    c=false;
                    d=false;
                    e=false;
                    f=false;
                }
            });
    
            item02.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    b=true;
                    a=false;c=false;d,e,f=false;
                }
            });
    
            item03.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    c=true;
                    a=false;b=!c;
                }
            });
    
            b0.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    if(a){Double n=Double.parseDouble(f0.getText());
    
                    Dollar d1=new Dollar(n);
                    Double d2=d1.Ex();
                    l1.setText(n+"USDは"+d2+"円");}
                    else if(b){Double n=Double.parseDouble(f0.getText());
                    //l1.C1(n);
                    Other c1=new Other(n);
                    Double c2=c1.Ex2();
    
                    l1.setText(n+"人民元は"+c2+"円");}
    
                    else if(c){Double n=Double.parseDouble(f0.getText());
                    //l1.C1(n);
                    Other c3=new Other(n);
                    Double c4=c3.Ex3();
    
                    l1.setText(n+"ユーロは"+c4+"円");}
    
                    else{return;} 
                }
            });
        }
    
        public static void main(String[] args) throws Exception {
            new Rate2().setVisible(true);
        }
    
        static class Dollar{
            int d=106;
            // int c=15;
            Double dl;Double n;
    
            public Dollar(Double n){
                this.n=n;
    
            }
    
            public Double Ex(){
                return dl=d*n;
            }
        }
    
        static class Other {
            Double cn;
            int c=15;
            int d=123;
            Double n;
            public Other(Double n){
                this.n=n;
            }
    
            public Double Ex2(){
                return cn=c*n;
            }
    
            public Double Ex3(){
                return cn=d*n;
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2020-07-26T04:41:56.960
68975
2020-07-26T21:59:11.910
2020-07-26T05:51:47.310
3060
39688
question
java
複数のboolean型変数を一括でfalseにしたい場合はどうすればいいですか？


簡潔に書くなら  
`a=b=c=d=e=false;`  
という書き方ができます。


CC BY-SA 4.0
2020-07-26T05:02:50.847
68976
2020-07-26T05:02:50.847
40962
68975
answer


一応、次のように書くことで複数の変数へ同じ値を一気に代入することはできます。

[code]

    boolean x, y, z;
    x = y = z = false;
    
[/code]

ですが、 **なるべく避けた方が良いです**
。このようにたくさんの変数を必要とするような場面では、配列や辞書など、「似たようなもの」を統一的に扱えるデータ構造が利用できないか考えてみてください。

今回の場合は「複数の状態があってどれかひとつのみが選ばれている」という状況を複数の変数で表現しようとなさっているように見えます。この場合 boolean
は用いず、enum を使ってそれぞれの状態を表す定数を作り、状態を表す変数にその enum の値を代入することで表現するのが良さそうです。


CC BY-SA 4.0
2020-07-26T05:03:42.393
68977
2020-07-26T06:46:05.580
2020-07-26T06:46:05.580
19110
19110
68975
answer


今回の場合、選択状態にあるメニューは1つだけなので、それを覚えておけば良いです。

それぞれのメニューについて、個々に選択されているかされていないかを覚えておく必要はありません。

例えば次のように書くことができます:

[code]

    public class Rate2 extends JFrame {
        // ...
    
        // 以下は不要
        // boolean a=false;
        // boolean b=false;boolean c=false;boolean d;boolean e;boolean f;
        // 代わりに選択されたメニューを覚えておく変数を追加
        private JMenuItem selected;
    
        public Rate2() {
            // ...
            ActionListener menuItemActionListener = new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    // a=true;
                    // b=false;
                    // c=false;
                    // d=false;
                    // e=false;
                    // f=false;
                    // 選択されたメニューをセット
                    selected = (JMenuItem) evt.getSource();
                }
            };
            item01.addActionListener(menuItemActionListener);
            item02.addActionListener(menuItemActionListener);
            item03.addActionListener(menuItemActionListener);
    
            b0.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    // item01 が選択されていた場合
                    if(selected == item01){Double n=Double.parseDouble(f0.getText());
    
                    Dollar d1=new Dollar(n);
                    Double d2=d1.Ex();
                    l1.setText(n+"USDは"+d2+"円");}
                    // item02 が選択されていた場合
                    else if(selected == item02){Double n=Double.parseDouble(f0.getText());
                    //l1.C1(n);
                    Other c1=new Other(n);
                    Double c2=c1.Ex2();
    
                    l1.setText(n+"人民元は"+c2+"円");}
    
                    // item03 が選択されていた場合
                    else if(selected == item03){Double n=Double.parseDouble(f0.getText());
                    //l1.C1(n);
                    Other c3=new Other(n);
                    Double c4=c3.Ex3();
    
                    l1.setText(n+"ユーロは"+c4+"円");}
    
                    else{return;} 
                }
    
[/code]

* * *

【追記】コメントにある疑問点に対して:

> private JMenuItem selectedという文法は初耳です。どのような仕組みでしょうか？

どの部分が初耳である、という点に該当するのか分かりませんでしたが、これ自体は、質問文中にあるコードの

[code]

        int n;
        JMenuBar mbar = new JMenuBar();
        JTextField f0 = new JTextField("");
        JButton b0 = new JButton("実行");
    
[/code]

などと同様、`Rate2`クラスのインスタンス変数の宣言です。  
`private`はアクセス修飾子と呼ばれるものですが、これもまた質問文中のコード

[code]

            public Double Ex2(){
                return cn=c*n;
            }
    
[/code]

の`public`に対応するものです(例えば[こちら](https://docs.oracle.com/cd/E82638_01/jjdev/Java-
overview.html#GUID-2179A214-AF5E-4FE5-83DF-EBB6A464ED35)で説明されています)。

> またその後に続くActionListener menuItemActionListener = new
> ActionListener()〜という組み立て方も初めて見ました。

こちらは、質問文中のコード

[code]

    item01.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            // ...
        }
    });
    
[/code]

の、`ActionListener` インスタンス生成と設定を同時に行っている処理を分離して、インスタンスを一旦変数に代入しているだけです。  
分離の意図は、生成したインスタンスを他の箇所でも使いたいからです。  
(`item01`だけでなく、`item02`や`item03`にも同じ`ActionListener`を設定したい)

どちらについても、Javaコードとしては一般的で、他のサンプルコード等でも頻出しているかと思います。


CC BY-SA 4.0
2020-07-26T07:06:29.163
68978
2020-07-26T21:59:11.910
2020-07-26T21:59:11.910
2808
2808
68975
answer