0

我有函数 dodaj(); 在 JFrame 中,在这个 JFrame 中我有 JPanel。要使用 JPanel 中的按钮,我正在使用 ActionListener。但是当有人点击按钮时,我想调用函数 dodaj(); 来自 JFrame。如果我在 JFrame 中有 ActionLIstener,我可以使用 this.dodaj();,但我在 JPanel 上有动作监听器,它是组合 od JFrame。我怎么能打电话给 dodaj(); 来自 ActionListener 的(JFrame 函数)在 JPanel 上?

感谢您阅读它,并为我糟糕的英语感到抱歉。

4

2 回答 2

2

你没有提到它,但是你的 JFrame 和 JPanels 都是类,所以你的问题是你想从另一个类中的一个类调用一个方法?如果是这样,关键是获取对 JFrame 类的引用,并通过构造函数或方法参数将其传递给 JPanel 类。

例如:

class MyFrame extends JFrame {
   private MyPanel myPanel;

   public MyFrame() {
      myPanel = new MyPanel(this);
   }

   public void frameMethod() {
      System.out.println("in JFrame's frameMethod");
   }

}

class MyPanel extends JPanel {
   private MyFrame myFrame;
   private JButton someButton = new JButton("Button");

   public MyPanel(final MyFrame myFrame) {
      this.myFrame = myFrame;

      someButton.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent arg0) {
            myFrame.frameMethod();
         }
      });
   }  
}

顺便说一句,我不建议在没有充分理由(例如需要覆盖方法)的情况下扩展 JFrame 或 JPanel。

于 2012-04-15T20:16:30.490 回答
1

在您的 JPanel 中,您始终可以使用 getParent() 引用您的父 JFrame 容器。

如果你在 JPanel 上的 ActionListener 是一个匿名类,你可以直接使用 getParent() 方法直接引用它。如果您的 ActionListener 是一个单独的类,您可以在实例化它时将父引用传递给它。

于 2012-04-15T20:24:45.340 回答