2015-02-06 78 views
0

我已經在NetBeans中使用JFrame Form創建了JFrame。在這個JFrame中,我有第二個JPanel嵌套的JPanel。然後我有單獨的JPanel類(我已經擴展JPanel)。JFrame和JPanel之間的通信

我想使用這個單獨的JPanel作爲JFrame中的嵌套JPanel。當我點擊一個JButton時,我想通知JFrame,該按鈕被點擊。

到目前爲止,我managet使用,以獲得單獨的JPanel到JFrame在JFrame的initComponents()如下:

nestedPanel = new separateJPanel 

但現在我不知道如何發送信息按鈕已被點擊。

任何提示我怎麼能做到這一點?

+0

將IDE置於設計模式。點擊你創建的按鈕。在左側,您應該在屬性下看到一個名爲events的選項卡。如果你點擊其中一個方法,將在面板中創建一個方法,該按鈕被嵌套。 – 2015-02-06 18:46:09

回答

3

一個簡單的方法是給JPanel類一個委託方法,允許其他類將ActionListeners添加到感興趣的按鈕。例如:

public void addButton1ActionListener(ActionListener listener) { 
    button1.addActionListener(listener); 
} 

這樣,如果JFrame中保持JPanel的一個實例,它可以調用此方法對於聽者通入的JButton。例如:

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class Foo { 
    private static void createAndShowGui() { 
     Frame1 frame = new Frame1(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

// I almost never extend JFrame 
class Frame1 extends JFrame { 
    private Panel1 panel1 = new Panel1(); 
    private JLabel label = new JLabel(" ", SwingConstants.CENTER); 

    public Frame1() { 
     super("Foo"); 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     add(panel1, BorderLayout.CENTER); 
     add(label, BorderLayout.SOUTH); 
     pack(); 
     setLocationByPlatform(true); 

     panel1.addButton1ActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      label.setText("Button pressed"); 
     } 
     }); 
    } 
} 

class Panel1 extends JPanel { 
    private JButton button1 = new JButton("Button"); 

    public Panel1() { 
     add(button1); 
    } 

    public void addButton1ActionListener(ActionListener listener) { 
     button1.addActionListener(listener); 
    } 
} 

請注意,此解決方案是對簡單的玩具項目,但如果你的想法是創建一個真正的大規模應用,這將無法很好地擴展,因爲它會增加你的代碼的耦合,降低凝聚力。在這種情況下更好的是努力創建一個使用更多模型 - 視圖 - 控制或MCV架構的程序。

+0

謝謝,這就是我一直在尋找的。 – taggart 2015-02-07 10:00:30

4

您可以給框架一個面板屬性和麪板一個框架屬性將它們綁定在內存中。通過這種方式,您可以輕鬆地將數據通過實例字段傳遞給另一個。

public MyPanel extends JPanel { 

    MyFrame frame; 

    MyPanel(MyFrame frame) { 
     this.panel = panel; 
    } 
} 
+1

雖然它可以工作,但我個人不喜歡以這種方式將類暴露給其他類(應該真的能夠更改框架的屬性?)。一般來說,我傾向於使用描述兩個類之間的契約的接口,但這只是我;) – MadProgrammer 2015-02-06 20:13:30