68962


以下のプログラムでは、プルダウンでUSD to JPYを選ぶと米ドルから日本円に換金され、CNY to
JPYを選ぶと、人民元から日本円に換金されるのですが、一回ずつ選んだ後は、最後に選んだ通貨のプログラムしか実行されません。

例えば1回目でUSDを選ぶと米ドルの計算になり、その後CNYを選ぶと人民元の計算になるが、その後は米ドルを選んでも、最後に選んだ人民元の計算しかされない
(逆も然り)。

どうしてこのようになってしまうのでしょうか？ `for` 文等で回していないからでしょうか？

[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("Currency"); 
        JMenuItem item01 = new JMenuItem("USD to JPY");
        JMenuItem item02 = new JMenuItem("CNY to JPY");
        boolean a=false;
        boolean b=false;
    
        public Rate2() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            setTitle("menu sample");
            setLayout(null);
    
            add(f0); f0.setBounds(100, 50, 50, 30);
            add(b0);b0.setBounds(150,50,50,30);
            mbar.add(menu1);setJMenuBar(mbar);
            menu1.add(item01);menu1.add(item02);
    
            add(l1);l1.setBounds(150,140,150,100);
            //pack(); 
            setSize(400, 300);
    
            item01.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    a=true;
                }
            });
    
            item02.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    b=true;
                }
            });
    
            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());
    
                    CNY c1=new CNY(n);
                    Double c2=c1.Ex2();
    
                    l1.setText(n+"人民元は"+c2+"円");}
    
                    else{return;} 
    
                }
            });
        }
    
        public static void main(String[] args) throws Exception {
            new Rate2().setVisible(true);
        }
    
        static class Dollar{
            int d=100;
    
            Double dl;Double n;
    
            public Dollar(Double n){
                this.n=n;
            }
    
            public Double Ex(){
                return dl=d*n;
            }
        }
    
        static class CNY {
            Double cn;
            int c=15;
            Double n;
            public CNY(Double n){
                this.n=n;
            }
    
            public Double Ex2(){
                return cn=c*n;
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2020-07-25T15:06:32.547
68960
2020-07-26T05:46:24.953
2020-07-26T05:46:24.953
3060
39688
question
java
ユーザーインターフェースのプルダウンで、最初の1回しか計算が走らない


実行ボタンを押したときの条件判定が次のようになっていますが、一旦`a`が`true`になった場合、`false`に戻ることはないので常にドル円計算になっています。  
(つまり、質問文に書かれている状況説明は正確ではありません)

[code]

    b0.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            if (a) {
                // ドル円計算
            } else if (b) {
                // 元円計算
            } else {
                return;
            }
        }
    });
    
[/code]

メニューを選んだ際、反対側のフラグを`false`に設定してやれば所望の動作になるかと思います。

[code]

    item01.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            a = true;
            b = !a;
        }
    });
    
    item02.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            b = true;
            a = !b;
        }
    });
    
[/code]


CC BY-SA 4.0
2020-07-25T15:54:15.703
68962
2020-07-25T15:54:15.703
2808
68960
answer