Java 使用Jpanel,repaint()方法在类之间进行通信
我有一个扩展JPanel的类“GUI”。我有另一个类“Buttons”,它扩展了JFrame。我试图让JFrame类在JFrame上按下JButton“clearB”时调用JPanel类中的方法“clearScreen()”。 我能做到这一点的唯一方法是在JButton的actionlistener中为JPanel类“GUI”构建对象: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(){
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()方法不起作用,原因我不知道。
有人请告诉我一个更简单,工作的方式做什么,我试图在这里完成。
谢谢DActionListener无法工作的原因是,您在其中创建的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();
}