2017-04-10 186 views
1

我正在創建WindowBuilder GUI,並且需要將使用單選按鈕創建的變量傳遞給EventHandler類以用於進一步處理。單選按鈕事件的輸出成功;但是,在EventHanler類中未解析actionPerformed方法中聲明的變量「df」。任何幫助將不勝感激。「public void actionPerformed(ActionEvent event)」中聲明的變量無法傳遞

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

變量「DF」,這是在actionPerformed方法宣佈沒有解決在EventHanler類中。

這是因爲variable scope。在你的例子中,你聲明df作爲你傳遞給addActionListener(ActionListener)的匿名內部類的actionPerformed(ActionEvent)方法內的局部變量。局部變量只能在其創建的代碼塊中訪問。這意味着您的df變量不能在除actionPerformed(ActionEvent)方法以外的任何其他位置訪問。

解決此問題的第一步是在Test類中使df爲實例變量,以便可以在actionPerformed(ActionEvent)方法內部和外部訪問它。

從這裏有兩種可能的方法:

  1. 使用第二個匿名內部類的兩個按鈕

    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. 通行證dfEventHandler

    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 
         } 
        } 
    } 
    
構造

邊注意:不要使用null佈局!請參閱Why is it frowned upon to use a null layout in Swing?