2011-06-01 37 views
5

我有简单的Swing GUI,主窗口JFrame,其主面板来自JPanel。面板上有一些按钮可以点击并生成事件。摆动 - 从面板内呼叫事件

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

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

回答

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

在指定实现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类使得新的派生类实现所需的接口。

+0

是的,我知道这一点。但是,我想要在父级JFrame类中的动作监听器 - *这是问题* – zaharpopov 2011-06-01 13:35:44

1

看看this使用SwingWorker的教程。

+0

为什么它可以帮助我?我只是想从JPanel中以干净的方式访问JFrame,它包含了 – zaharpopov 2011-06-01 13:36:43

+0

sry,不清楚。你可以使用'SwingUtilities.getWindowAncestor(JPanel)'获取父窗口 – oliholz 2011-06-01 13:40:12

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 
    } 
} 
+0

但是,必须解复用所有已调用的按钮,对吧?都达到相同的'actionPerformed'回调? – zaharpopov 2011-06-01 14:25:31

+0

这是正确的。我看到你正在谈论的问题。也许传递框架是一个更好的选择... – MByD 2011-06-01 14:29:02