2013-08-07 127 views
1

我想測試一下按鈕,但我不能讓一個動作監聽工作如何一個ActionListener添加到按鈕的邊框在Java中

public class ButtonTester implements ActionListener { 

static JLabel Label = new JLabel("Hello Buttons! Will You Work?!"); 
public static void main(String[] args) { 
    //Creating a Label for step 3 
    // now for buttons 
    JButton Button1 = new JButton("Test if Button Worked"); 
    // step 1: create the frame 
    JFrame frame = new JFrame ("FrameDemo"); 
    //step 2: set frame behaviors (close buttons and stuff) 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //step 3: create labels to put in the frame 
    frame.getContentPane().add(Label, BorderLayout.NORTH); 
    frame.getContentPane().add(Button1, BorderLayout.AFTER_LAST_LINE); 
    //step 4: Size the frame 
    frame.pack(); 
    //step 5: show the frame 
    frame.setVisible(true); 
    Button1.setActionCommand("Test"); 
    Button1.setEnabled(true); 
    Button1.addActionListener(this); //this line here won't work 
} 
@Override 
public void actionPerformed(ActionEvent e) { 
    // TODO Auto-generated method stub 
    if("Test".equals(e.getActionCommand())) 
    { 
     Label.setText("It Worked!!!"); 
    } 
    } 

} 
+1

您應該在Swing事件線程上使用SwingUtilities.invokeLater()在main()中創建Swing組件。讓ButtonTester實現Runnable,將代碼從main()移動到run(),然後從main()中執行SwingUtilities.invokeLater(new ButtonTester())將一次解決許多問題。 –

+0

請學習java命名約定並遵守它們。 – kleopatra

回答

3

this在一個static方法沒有上下文

相反,嘗試使用類似Button1.addActionListener(new ButtonTester());,而不是...

更新

您可能還想看看Initial Threads,因爲Swing有一些特殊要求...

+0

也是一個很好的解決方案。 –

3

靜態方法與類的實例無關,因此無法使用this

你可以從主從主把所有的代碼ButtonTester的非靜態方法(比如,run(),例如)和做這樣的事情:

new ButtonTester().run(); 

你也可以使用匿名內部類爲ActionListener的:

Button1.addActionLister(new ActionListener() { 
    @Override public void actionPerformed (ActionEvent e) { 
     // ... 
    } 
}); 
+1

同意,不喜歡在'main'方法中逗留。也忘了提及初始線程 – MadProgrammer

+1

即使一個普通的內部類可能是好的,如果你想改變或訪問按鈕的屬性,並希望更多的可訪問性。 – snickers10m

1

java的說,你不能從靜態上下文訪問非靜態的實體(這是指一個對象,它是靜態的非主和()是靜態的),所以我們使用的構造函數用於初始化:

public class ButtonTester implements ActionListener { 
static JLabel Label = new JLabel("Hello Buttons! Will You Work?!"); 
ButtonTester() //constructor 
{ 
//Creating a Label for step 3 
    // now for buttons 
    JButton Button1 = new JButton("Test if Button Worked"); 
    // step 1: create the frame 
    JFrame frame = new JFrame ("FrameDemo"); 
    //step 2: set frame behaviors (close buttons and stuff) 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //step 3: create labels to put in the frame 
    frame.getContentPane().add(Label, BorderLayout.NORTH); 
    frame.getContentPane().add(Button1, BorderLayout.AFTER_LAST_LINE); 
    //step 4: Size the frame 
    frame.pack(); 
    //step 5: show the frame 
    frame.setVisible(true); 
    Button1.setActionCommand("Test"); 
    Button1.setEnabled(true); 
    Button1.addActionListener(this); //this line here won't work 
} 


public static void main(String[] args) { 
ButtonTester test1=new ButtonTester();// constructor will be invoked and new object created 


} 
@Override 
public void actionPerformed(ActionEvent e) { 
    // TODO Auto-generated method stub 
    if("Test".equals(e.getActionCommand())) 
    { 
     Label.setText("It Worked!!!"); 
    } 
    } 
} 
相關問題