2013-10-23 83 views
0

嗯,這是一個非常新穎的提示。我聲稱自己寫了我的GUI應用程序的代碼,在窗口生成器的幫助下,我決定停止使用netbeans,因此在這裏閱讀了一些人物,說這很好。你可能會認爲我還沒有調查,但是請相信我,我做功課......搖擺和事件

我tryed預言的方式說:

  1. 聲明一個事件處理程序類,並指定任一類實現一個ActionListener接口或擴展實現ActionListener接口的類。例如:

    公共MyClass類實現的ActionListener {

  2. 註冊事件處理程序類的實例爲在一個或多個組件的監聽器。例如:

    someComponent.addActionListener(instanceOfMyClass);

  3. 包含在偵聽器接口中實現方法的代碼。例如:

    公共無效的actionPerformed(ActionEvent的五){ ... //代碼,反應動作...... }

和我自己的方式(錯誤,偏離航線,但我不知道什麼是錯誤的)

package Todos; 
import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class Main extends JFrame { 

private JPanel contentPane; 
protected JButton btnNewButton; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       Main frame = new Main(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 


} 

/** 
* Create the frame. 
*/ 
public Main() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.getContentPane().setLayout(new BorderLayout()); 
    //setDefaultLookAndFeelDecorated(false); 
    //setIconImage(Image imagen); 
    setTitle(""); 
    setSize(java.awt.Toolkit.getDefaultToolkit().getScreenSize()); 
    setPreferredSize(java.awt.Toolkit.getDefaultToolkit().getScreenSize()); 
    setLocationRelativeTo(null); 

    this.btnNewButton = new JButton("New button"); 
    this.btnNewButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      asd(arg0); 
     } 
    }); 
    this.getContentPane().add(this.btnNewButton, BorderLayout.NORTH); 
} 

public void asd(ActionEvent arg0) { 
    this.getContentPane().add(new JButton("asd")); 
} 
} 

的cuestion是,爲什麼這個代碼不工作,將JButton IM嘗試添加到ActionField事件的JFrame在單擊後不可見。

這是一個示例代碼,可能看起來很愚蠢,但我認爲它簡化了提示,因爲我的問題是在幾行代碼中,它並不需要向您展示洞眼。

預先感謝您!

+0

而你的問題是......? –

+0

問題是什麼?您沒有像所描述的那樣創建或實現動作偵聽器,而是使用內部類。 – 2013-10-23 10:53:25

+0

對不起,編輯我的問題... @nikpon,我使用內部類訪問NetBeans等JFrame內容。這就是爲什麼我說「我自己的方式」(即使我這樣做,甲骨文說,也沒有爲我工作) – Hernan

回答

2

你的問題是在這裏:

public void asd(ActionEvent arg0) { 
    this.getContentPane().add(new JButton("asd")); 
} 

形式Container.add()的javadoc:

此方法更改佈局相關信息,因此, 無效的組件層次。 如果容器已顯示 ,則此後必須驗證層次結構,以便 顯示添加的組件。

需要調用validate()方法,使添加的按鈕可見:

public void asd(ActionEvent arg0) { 
    this.getContentPane().add(new JButton("asd")); 
    this.getContentPane().validate(); 
} 
+0

完美,謝謝你們!問題解決了! – Hernan

+0

不客氣! :-) – dic19