我有简单的Swing GUI,主窗口JFrame
,其主面板来自JPanel
。面板上有一些按钮可以点击并生成事件。摆动 - 从面板内呼叫事件
我希望这些事件影响存储在JFrame
中的数据,因为它是我的主应用程序 - 它有一些线程队列,打开流等。
那么如何让面板中的按钮在其父框架中调用回调? Java/Swing的最佳做法是什么?
我有简单的Swing GUI,主窗口JFrame
,其主面板来自JPanel
。面板上有一些按钮可以点击并生成事件。摆动 - 从面板内呼叫事件
我希望这些事件影响存储在JFrame
中的数据,因为它是我的主应用程序 - 它有一些线程队列,打开流等。
那么如何让面板中的按钮在其父框架中调用回调? Java/Swing的最佳做法是什么?
要调用父框架中的方法,需要引用父框架。所以,你的JPanel的构造方法可以声明如下:
public MyPanel(MyFrame frame){
super();
this.frame = frame;
//the rest of your code
}
而且在JFrame中调用此构造是这样的:
panel = new MyPanel(this);//this refers to your JFrame
在连接到你的按钮事件处理程序,你现在可以访问框架并可根据需要调用各种方法。
button1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//do some stuff
frame.someMethod();//invoke method on frame
//do more stuff
}
});
在指定实现ActionListener的类的所需按钮上使用addActionListener方法。
ActionListenerClass actionListenerObject = new actionListenerClass();
JButton b = new JButton("Button");
b.addActionListener(actionListenerObject);
public class ActionListenerClass implements ActionListener(){
//or better : actionListenerClass extends AbstractAction
public void actionPerformed(ActionEvent e) {
}
}
编辑:
是的,我知道这一点。但动作 听众我想在父的JFrame 类 - 这就是问题所在
然后扩展JFrame类使得新的派生类实现所需的接口。
看看this使用SwingWorker的教程。
为什么它可以帮助我?我只是想从JPanel中以干净的方式访问JFrame,它包含了 – zaharpopov 2011-06-01 13:36:43
sry,不清楚。你可以使用'SwingUtilities.getWindowAncestor(JPanel)'获取父窗口 – oliholz 2011-06-01 13:40:12
你可以实现你的类具有的JFrame(或扩展吧)ActionListener
:
class MyPanelClass {
public MyPanelClass(ActionListener al)
{
//...
JButton myButton = new JButton("Button");
myButton.addActionListener(al);
//...
}
}
class MainClass extends JFrame implements ActionListener {
public void someMethod() {
MyPanelClass mpc = new MyPanelClass(this);
}
@Override
public void ActionPerformed(ActionEvent ev) {
// your implementation
}
}
但是,必须解复用所有已调用的按钮,对吧?都达到相同的'actionPerformed'回调? – zaharpopov 2011-06-01 14:25:31
这是正确的。我看到你正在谈论的问题。也许传递框架是一个更好的选择... – MByD 2011-06-01 14:29:02
是的,我知道这一点。但是,我想要在父级JFrame类中的动作监听器 - *这是问题* – zaharpopov 2011-06-01 13:35:44