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

Java 使用Jpanel,repaint()方法在类之间进行通信,java,swing,jpanel,actionlistener,Java,Swing,Jpanel,Actionlistener,我有一个扩展JPanel的类“GUI”。我有另一个类“Buttons”,它扩展了JFrame。我试图让JFrame类在JFrame上按下JButton“clearB”时调用JPanel类中的方法“clearScreen()”。 我能做到这一点的唯一方法是在JButton的actionlistener中为JPanel类“GUI”构建对象: clearB.addActionListener( new ActionListener(){

我有一个扩展JPanel的类“GUI”。我有另一个类“Buttons”,它扩展了JFrame。我试图让JFrame类在JFrame上按下JButton“clearB”时调用JPanel类中的方法“clearScreen()”。 我能做到这一点的唯一方法是在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

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

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

i、 e

有几点意见:

  • 不寻常的是,您必须有一个扩展JFrame的类。在我自己看来,除非必要,否则我尽量避免这样做,但通常是从JFrame类本身创建我的JFrames,并且只有在需要的时候
  • 我有点惊讶,您的主窗口类还没有GUI变量,因为它可能显示GUI实例
走在记忆的道路上——哇,两年前我真是个笨蛋
public class Buttons {
  private GUI gui;

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

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