2014-01-30 28 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

相關問題