2012-04-15 38 views
0

我有函数dodaj();在JFrame中,在这个JFrame中我有JPanel。 要使用来自JPanel的按钮,我使用ActionListener。但是当有人点击按钮时,我想调用函数dodaj();来自JFrame。 如果我在JFrame中有ActionLIstener,我可以使用this.dodaj();但是我在JPanel上有动作侦听器,其组成为JFrame。 我怎么能叫dodaj(); (JFrame函数)从ActionListener与JPanel?Java - 从组合对象调用this.function()

感谢您的阅读并抱歉我的英文不好。

+0

首先,您通常可以简单地调用没有'this.'部分的方法,通常它会起作用。 – 2012-04-15 20:14:58

+0

如果我这样做,我看到错误:“在JPanel中找不到符号” – user1304098 2012-04-15 20:16:22

回答

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中如需要覆盖的方法。

+0

感谢您解决我的问题:) – user1304098 2012-04-15 20:34:59

+0

@ user13:不客气。 – 2012-04-15 20:36:01

+0

为什么你不推荐扩展JFrame或JPanel? – user1304098 2012-04-15 20:36:25

1

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

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

+0

非常感谢。 – user1304098 2012-04-15 20:36:54