69185


以下のプログラムで質問です。

### 1点目

ActionLister 型のクラス menuItemActionListener でインスタンスオブジェクトを生成したのに、なぜその後、個々の
item01~item06 それぞれに `item01~06.addActionListener(menuItemActionListener);`
をする必要があるのでしょうか？

インスタンスオブジェクトである menuItemActionListener の中で既に  
`selected = (JMenuItem) evt.getSource();` と書いており、選択されたメニューアイテムを変数 selected
に代入するというプログラムだと思います。そうであれば、その後、直接

[code]

    b0.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            if(selected==item01) 〜
    
[/code]

とコードを書いてもいい気がします。なぜなら `if(selected==item01)` で、selected がitem01（02~06) かどうかを
boolean で判定しているためです。

なのに、なぜその前に `item01~06.addActionListener(menuItemActionListener);`
を入れる必要があるのでしょうか？

### 2点目

`selected = (JMenuItem) evt.getSource();` はどういう意味でしょうか？

よろしくお願いします。

**実行環境**  
openjdk version "1.8.0_242"  
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_242-b08)  
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.242-b08, mixed mode)

* * *

**全体のソースコード**

[code]

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class RateK 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("Foreign Currency→to JPY"); 
      JMenu menu2=new JMenu("JPY to→Foreign Currency");
      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");
      JMenuItem selected;
    
      boolean a=false;
      boolean b=false;boolean c=false;boolean d;boolean e;boolean f;
     // boolean[]t=new boolean[6];
     
      
    
      public RateK() {
        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(50,140,300,100);
        //pack(); 
        setSize(600, 400);
       
       ActionListener menuItemActionListener = new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                   
                    // 選択されたメニューをセット
                    selected = (JMenuItem) evt.getSource();
                  
                }
            };
            item01.addActionListener(menuItemActionListener);
            item02.addActionListener(menuItemActionListener);
            item03.addActionListener(menuItemActionListener);
            item04.addActionListener(menuItemActionListener);
            item05.addActionListener(menuItemActionListener);
            item06.addActionListener(menuItemActionListener);
    
        
        
        b0.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
            if(selected==item01){Double n=Double.parseDouble(f0.getText());
            
                Dollar d1=new Dollar(n);
               Double d2=d1.Ex();
                l1.setText(n+"USDは"+d2+"円");}
            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+"円");}
    
            else if(selected==item03){Double n=Double.parseDouble(f0.getText());
                  
                  Other c3=new Other(n);
                  Double c4=c3.Ex3();
                  
                  l1.setText(n+"ユーロは"+c4+"円");}
    
           else if(selected==item04){Double n=Double.parseDouble(f0.getText());
                    
                    Other c4=new Other(n);
                    Double c5=c4.Ex4();
                    
                    l1.setText(n+"円は"+c5+"ドル");}
    
           else if(selected==item05){Double n=Double.parseDouble(f0.getText());
                      
                      Other c5=new Other(n);
                      Double c6=c5.Ex5();
                      
                      l1.setText(n+"円は"+c6+"人民元");}
    
            else if(selected==item06){Double n=Double.parseDouble(f0.getText());
                      
                        Other c6=new Other(n);
                        Double c7=c6.Ex6();
                        
                        l1.setText(n+"円は"+c7+"ユーロ");}
    
                  
            
            else{return;} 
                
        
            }
          });
    
          
    }
    
    
     public static void main(String[] args) throws Exception {
        new RateK().setVisible(true);
        
      }
    
    
      
      
      static class Dollar{
       int d=106;
      
       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 e=0.0094;
         double f=0.0667;
         double g=0.0081;
         Double n;
         public Other(Double n){
           this.n=n;
         }
         
         public Double Ex2(){
          return cn=c*n;
          
         }
    
         public Double Ex3(){
           return cn=d*n;
         }
    
         public Double Ex4(){
          return cn=e*n;
        }
    
        public Double Ex5(){
          return cn=f*n;
        }
    
        public Double Ex6(){
          return cn=g*n;
        }
    
      }
    }
    
[/code]


CC BY-SA 4.0
2020-08-01T14:03:05.733
69168
2020-08-02T13:49:27.363
2020-08-01T17:02:01.373
3060
39688
question
java
JPnelのメソッド「addActionListener」の役割について（ユーザーインターフェース）


item01オブジェクトと、menuItemActionListenerオブジェクトだけがあるとします。

item01オブジェクトで何かAction（クリックされたりとか）が起きたら、どうなると思いますか？

２つのオブジェクトの間には何の関連付けも無いので、menuItemActionListnerオブジェクトにイベント(Actionが起きた事)が知らされる事はありません。

[code]

    selected = (JMenuItem) evt.getSource();
    
[/code]

と書かれていたって、イベント(evt)が無いのですから。

２つのオブジェクトを連携して動作するためには、item01オブジェクトで何かactionが起きたら、menuItemActionListenerが感知して処理してね。

[code]

    item01.addActionListener(menuItemActionListener);
    
[/code]

という設定が必要なんです。


CC BY-SA 4.0
2020-08-02T13:49:27.363
69185
2020-08-02T13:49:27.363
217
69168
answer