2013-07-04 89 views
-1

我剛開始學習Java 1周前,我是一個100%完全初學者。在這段代碼中,我似乎無法將一個actionlistener /得到一個工作。儘管讀了幾十篇教程,我甚至不知道在哪裏/如何/以何種方式放置它。我創建了一個帶有JPanel的JFrame,並在JPanel上有一個按鈕。到目前爲止這麼好(和工作)。但是,我希望它是這樣的,如果按鈕被點擊,另一個按鈕會出現。謝謝你sooo提前!Java actionlistener不起作用

import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.*; 
import java.awt.event.*; 
public class Skeleton extends JFrame implements ActionListener { 

    public static void main(String[] args) { 
    //------------------------------------------------ 
    JFrame frame = new JFrame("Skeleton"); 
    JPanel panel = new JPanel(); 
frame.setContentPane(panel); 
    frame.setSize(600,600); 
    frame.setResizable(false); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    JButton button = new JButton("This is a button."); 
    JButton button2 = new JButton("Hello"); 
    panel.setLayout(null); 
    button.setBounds(20,20,200,25); 
    button2.setBounds(20,70,200,25); 
    panel.add(button); 
    //------------------------------------------- 

button.addMouseListener(this); 


} 

public void ActionPerformed(ActionEvent e) { 
    System.out.println("Hello"); 

} 
} 

回答

2

您需要添加actionlistener。

將事件處理程序類的實例註冊爲一個或多個組件上的偵聽器。例如:

yourdesiredcomponent.addActionListener(this); 

欲瞭解更多詳細信息,請檢查doc

+0

謝謝你Stine –

4

我會給你一些建議

1)不要在頂部類實現ActionListener,使用匿名類或私有類來代替。

例子:

匿名類(也稱搖擺動作)

myComponent.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent evt){ 
       //code here 
     } 

}) 

//inner class 
public class Skeleton{ 

// in some part 
private class MyActionListener implements ActionListener{ 
     public void actionPerformed(ActionEvent evt){ 
      //code here 
     } 
} 


} 

2)您的代碼將無法編譯,因爲你沒有實現ActionListener接口

public void actionPerformed(ActionEvent evt)是簽名。

你必須addActionListener到您的組件

button.addActionListener(this);

3)不要使用空佈局,因爲你將有一個很大的問題,如果你想添加更多的組件或調整窗口的大小,因爲你必須手動輸入setBounds,這將令人沮喪,而不是使用[Layout Manager][1]

4)嘗試不擴展JFrame如果不是必要的,而是在你的類中有一個引用,例如。

public class Skeleton{ 

    private JFrame frame; 

    } 
+0

+1。但是我對你的4th點感到不舒服。它總是一個很好的方式來擴展JFrame收穫其最大的好處.. – Mac

+1

@Mac如果你想添加更多級別的繼承,我認爲與組成你可以做同樣的..至少你想重寫一些方法,例如paint ..在這種情況下,你也可以使用匿名類。 – nachokk

+0

但是,如果有一個模塊將成爲整個項目的標準,那麼創建一個新的自定義類將通過提供單個模塊來最大限度地減少大量冗餘你可以在同一個項目的其他類中擴展(** REUSE **),而不必擔心基本規則。 – Mac