使用Jpanel,repaint()方法在类之间进行通信

时间:2014-01-30 03:03:26

标签: java swing jpanel actionlistener

我有一个扩展JPanel的类“GUI”。我有另一个扩展JFrame的类“按钮”。我正在尝试让JFrame类在JPanel类中调用一个方法“clearScreen()”,当在JFrame上按下JButton“clearB”时。 我可以完成这项工作的唯一方法是在JButton的actionlistener中为JPanel类“GUI”构建对象:

clearB.addActionListener(
                new ActionListener(){
                    public void actionPerformed(ActionEvent event){
                        GUI g = new GUI();
                        g.clearScreen();

                    }
                }
            );

但是当我调用clearScreen()方法时,它看起来像这样:

public void clearScreen(){
        xs.clear();
        ys.clear();
        count = 0;
        repaint();
    }

没发生任何事。我猜这是因为repaint()方法由于我不知道的某些原因而无法正常工作。 有人请告诉我一个更容易,更有效的方法来做我想在这里完成的事情。 谢谢! :d

1 个答案:

答案 0 :(得分:2)

您的ActionListener无法正常工作的原因是您在其中创建的GUI对象有一个 new GUI对象,该对象与显示的GUI对象完全无关,因此在非显示的GUI实例上调用clearScreen()方法对显示的GUI实例没有影响。

解决方案是让您的Buttons类将有效引用保存到可视化GUI对象并调用此引用上的方法。引用可以通过setter方法或构造函数参数传递。

即,

public class Buttons {
  private GUI gui;

  public Buttons (GUI gui) {
    this.gui = gui;
  }

    // in some ActionListener code...
    gui.someMethod();
}

几条评论:

  • 你应该有一个扩展JFrame的类是不寻常的。我自己,除非必要,否则我会尽量避免这样做,而是通常从JFrame类本身创建我的JFrame,并且只在需要时才这样做。
  • 我有点惊讶你的主窗口类还没有GUI变量,因为它可能会显示GUI实例。