2016-09-09 38 views
0

我想創建一個菜單窗口,它將成爲gui類的一部分。 gui級別由經理級別控制。問題是,當我按下菜單中的按鈕時,我希望Manager類能夠知道按下了一個按鈕。我嘗試使用標誌來指示按鈕是否被按下,但由於某種原因它不起作用。這裏是我的代碼: 的GUI類:從另一個類控制JFame

public class Gui extends JFrame implements ActionListener { 

private JFrame jframe; 
private JPanel jpanel; 
private JButton jbutton; 
public boolean jbuttonFlag = false; 
Gui(){ 

    jframe = new JFrame("Test Frame"); 

    jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    jpanel = new JPanel(); 

    jpanel.setBackground(Color.BLUE); 

    jbutton = new JButton("Click Me"); 

    jbutton.addActionListener(this); 

    jpanel.add(jbutton); 

    jframe.add(jpanel); 

    jframe.pack(); 

    jframe.setVisible(true); 
} 

    public void actionPerformed(ActionEvent e) { 

      if(e.getActionCommand().equals("Click Me")) 

        jbuttonFlag = true; 
    } 
} 

和管理類:

public class Manager{ 

    Gui g; 

    Manager(){ 

     g = new Gui(); 

    } 

    public void Start(){ 

     while(!g.jbuttonFlag); 
     System.out.println("Button Pressed"); 

    } 

} 

當我點擊我要它,因爲它被點擊控制檯寫的按鈕,但它不」不會發生。爲什麼?謝謝!

回答

0

你應該同步它們,因爲它們是獨立的線程。這爲我工作:

管理器:

public void Start(){ 

     synchronized(g){try{g.wait();}catch(Exception e){}} 
     System.out.println("Button Pressed"); 

    } 

在桂:

public void actionPerformed(ActionEvent e) { 

      if(e.getActionCommand().equals("Click Me")){ 
       synchronized(this){ 
        this.notify(); 
       } 
      } 
    } 
+0

好的,謝謝!雖然條件也是一種同步,但是不能使用它,因爲一方面可以防止經理線程向前移動? – Keselme

+0

另一件事,如果我有不同的按鈕,我想爲每個按鈕有不同的響應,我需要爲每個按鈕使用同步? – Keselme

+0

您可以同步標誌或其他對象以確定按下哪個按鈕。只要確保其中一個線程寫入其他線程時不應該嘗試讀取它。雖然不是一個好的解決方案,因爲它通過忙於等待而使CPU保持忙碌。這可能會阻止您的操作偵聽器和其他線程。 –