2017-04-10 3 views
1

私はWindowBuilder GUIを作成しており、ラジオボタンで作成した変数をEventHandlerクラスに渡して処理する必要があります。ラジオボタンイベントの出力は正常です。ただし、actionPerformedメソッドで宣言された変数 "df"は、EventHanlerクラスで解決されません。どんな助けもありがとう。"public void actionPerformed(ActionEvent event)"でdelclaredされた変数を渡すことができません

public TestClass() { 

    /* INSERT RADIOBUTTON INTO FRAME. */ 
    JRadioButton rdbtnNo = new JRadioButton("No"); 
    rdbtnNo.setFont(new Font("Tahoma", Font.BOLD, 12)); 
    rdbtnNo.setBounds(332, 509, 63, 23); 
    frame.getContentPane().add(rdbtnNo); 

    /* LISTEN FOR RADIOBUTTON BUTTON. */ 
    rdbtnNo.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent event) { 
      String command = event.getActionCommand(); 
      System.out.println(command); 
      int df = 20;      
     }   
    }); 

    rdbtn.setActionCommand("event"); 
    rdbtn.addActionListener(new EventHandler()); 

} 

public class EventHandler implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 

     System.out.println(df); 
    } 
}        
+0

TestClass()メソッドは何も返しますか? – Omore

+0

可変スコープについて:http://www.java-made-easy.com/variable-scope.html – ControlAltDel

答えて

-1

まず、匿名の内部クラスを取り除き、代わりにlambdasを使用します。これは、コードをはるかに簡単に理解できるようにします。あなたのコード内

public TestClass() { 

    /* INSERT RADIOBUTTON INTO FRAME. */ 
    JRadioButton rdbtnNo = new JRadioButton("No"); 
    rdbtnNo.setFont(new Font("Tahoma", Font.BOLD, 12)); 
    rdbtnNo.setBounds(332, 509, 63, 23); 
    frame.getContentPane().add(rdbtnNo); 

    /* LISTEN FOR RADIOBUTTON BUTTON. */ 
    rdbtnNo.addActionListener(event -> pressedTheButton(event)); 

    rdbtn.setActionCommand("event"); 
    rdbtn.addActionListener(new EventHandler()); 

} 

public void pressedTheButton(ActionEvent event) { 
    String command = event.getActionCommand(); 
    System.out.println(command); 
    int df = 20; 
    printStuff(df); 
} 

public void printStuff(int input) { 
    System.out.println(input); 
} 



      ///DELETE THIS. This is unneeded, use Java 8 stuff, it's awesome//// 
public class EventHandler implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 

     System.out.println(df); 
    } 
}  
0
rdbtnNo.addActionListener(new EventHandler()); 

。 他にも間違いがありますが、その内部クラスを以下に宣言している場合は、addActionListenerメソッドでそれをインスタンス化して活用する必要があります。

0

その変数のスコープは唯一のそのメソッドであるため、それは、他のクラスでは解決できない。

public void actionPerformed(ActionEvent event) { 
       String command = event.getActionCommand(); 
       System.out.println(command); 
       int df = 20;      
      } 
+0

2つのeventListenersを追加しようとしていますか? – strash

0

解決しないでactionPerformedメソッド内で宣言された変数「DF」、 EventHanlerクラス内にあります。

これはvariable scopeのためです。あなたの例では、addActionListener(ActionListener)に渡す匿名の内部クラスのactionPerformed(ActionEvent)メソッド内のローカル変数としてdfを宣言しています。ローカル変数は、作成したコードブロック内でしかアクセスできません。つまり、df変数は、actionPerformed(ActionEvent)以外の方法ではアクセスできません。

Testクラスのインスタンス変数にして、actionPerformed(ActionEvent)メソッドの内部と外部からアクセスできるようにするための第一歩です。

  1. EventHandler

    public class Test { 
    
        private int df; 
    
        public Test() { 
         // ... button1 ... 
         final JButton button2 = new JButton("Click Me Again"); 
         button2.addActionListener(new EventHandler()); 
         // ... 
        } 
    
    } 
    
    // different file 
    public class EventHandler implements ActionListener { 
    
        private int df; 
    
        public EventHandler(int df) { 
         this.df = df; // got instance 
        } 
    
        @Override 
        public void actionPerformed(ActionEvent e) { 
         if(df == 20) { 
          // TODO do a thing 
         } 
        } 
    } 
    
のコンストラクタに渡す df

public class Test { 

    private int df; 

    public Test() { 
     // ... 
     final JButton button = new JButton("Click Me"); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       df = 20; 
      } 

     }); 
     final JButton button2 = new JButton("Click Me Again"); 
     button2.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if(df == 20) { // got instance 
        // TODO do a thing 
       } 
      } 

     }); 
     // ... 
    } 

} 
  • 両方のボタンのために第二の匿名内部クラスを使用してください:2つの可能なアプローチがあります。ここから

    サイドノート:nullレイアウトを使用しないでください! Why is it frowned upon to use a null layout in Swing?

  • 関連する問題