2015-04-25 115 views
1

我面對一個簡單的JFrame應用程序,它只有一個按鈕以更改字段值時出現一個奇怪的問題。當我嘗試調試我的應用程序時,它工作正常,但是當我嘗試運行它時,它不起作用並陷入while循環。 這是我的圖形類:JButton不更改字段值

public class Test extends JFrame implements ActionListener 
{ 
    private static final long serialVersionUID = 1L; 
    private boolean connectPressed; 
    public JButton btnConnect; 
    public Test() 
    { 
     JPanel p = new JPanel(); 
     p.setLayout(null); 

     // connect button 
     btnConnect = new JButton("connect"); 
     btnConnect.setBounds(0, 0, 100, 20); 
     p.add(btnConnect); 
     btnConnect.addActionListener(this);  


     getContentPane().add(p); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setTitle("Client"); 
     setSize(200,200); 
     setVisible(true); 
    } 

    public boolean get() 
    { 
     //System.out.println(connectPressed); 
     return connectPressed; 
    } 

    public void set(boolean b) 
    { 
     connectPressed = b; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     //e.getActionCommand(); 
     connectPressed = true; 
     System.out.println(connectPressed); 
    } 

} 

,這裏是我的測試代碼的應用程序:

public class Test2 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("Hello"); 
     Test t = new Test(); 

     t.set(false); 
     while (true) 
     { 
      if ((t.get())) 
       break;    
     } 
     System.out.println("Bye"); 

    } 

} 

誰能幫助我是什麼問題?

回答

1

當你運行這個:

while (true) { 
    if ((t.get())) 
     break;    
} 

線程會吃掉所有的CPU,使得UI反應遲鈍;要克服,一個簡單的辦法是增加睡眠時間內環路:

while (true) { 
    Thread.sleep(250); // sleep for 250 msecs 
    if (t.get()) 
     break;    
} 

反正它僅僅是一個例子,不是一個真正的解決方案;更好的方法是將您的主類註冊爲listener,或者在separated thread中運行循環。