我有一个简单的Swing GUI,主窗口JFrame
,其主面板派生自JPanel
。该面板有一些按钮,可以单击并生成事件。
我希望这些事件影响存储在JFrame
中的数据,因为它是我的主要应用程序 - 它有一些队列用于线程,开放流等等。
那么如何让我的按钮在面板中调用其父框架中的回调? Java / Swing的最佳实践是什么?
答案 0 :(得分:3)
要调用父框架中的方法,您需要对父框架的引用。所以你的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
}
});
答案 1 :(得分:1)
在指定实现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中 class - 这是问题
然后扩展JFrame类,使新的派生类实现所需的接口。
答案 2 :(得分:1)
查看this教程,了解如何使用SwingWorker。
答案 3 :(得分:1)
您可以在类中实现具有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
}
}