2015-04-25 69 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中运行循环。