2014-01-30 25 views
1

我有一个扩展JPanel的类“GUI”。我有另一个扩展JFrame的类“按钮”。当JFrame上的JButton“clearB”被按下时,我试图让JFrame类在JPanel类中调用一个“clearScreen()”方法。 我可以做这项工作的唯一途径是通过建立对象对JPanel类“GUI”就在ActionListener的对JButton:在使用Jpanel的类之间进行通信,repaint()方法

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

回答

2

ActionListener不工作的原因是因为您在那里创建的GUI对象是一个新的 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实例。
+0

往下走的记忆道 - 哇我两年前就是这样一个noob – johmsp

相关问题