我有函数dodaj();在JFrame中,在这个JFrame中我有JPanel。 要使用JPanel中的按钮我正在使用ActionListener。但是当有人点击按钮我想调用函数dodaj();来自JFrame。 如果我在JFrame中有ActionLIstener我可以使用this.dodaj();,但我在JPanel上有动作监听器,其组成为JFrame。 我怎么能打电话给dodaj();来自ActionListener的(JFrame函数)是在JPanel?
上感谢您阅读并抱歉我的英语不好。
答案 0 :(得分:2)
你没有提到它,但是你的JFrame和JPanel都是这两个类,所以你的问题是你想从另一个类的一个类调用一个方法?如果是这样,关键是获取对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,例如需要覆盖方法。
答案 1 :(得分:1)
在您的JPanel中,您始终可以使用getParent()返回您的父JFrame容器。
如果JPanel上的ActionListener是一个匿名类,您可以直接使用getParent()方法直接引用它。如果ActionListener是一个单独的类,则可以在实例化时将父引用传递给它。