一個簡單的方法是給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架構的程序。
將IDE置於設計模式。點擊你創建的按鈕。在左側,您應該在屬性下看到一個名爲events的選項卡。如果你點擊其中一個方法,將在面板中創建一個方法,該按鈕被嵌套。 – 2015-02-06 18:46:09