Swing - 从面板内部调用事件

时间:2011-06-01 13:28:20

标签: java swing jframe jbutton actionlistener

我有一个简单的Swing GUI,主窗口JFrame,其主面板派生自JPanel。该面板有一些按钮,可以单击并生成事件。

我希望这些事件影响存储在JFrame中的数据,因为它是我的主要应用程序 - 它有一些队列用于线程,开放流等等。

那么如何让我的按钮在面板中调用其父框架中的回调? Java / Swing的最佳实践是什么?

4 个答案:

答案 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
    }
}