2014-07-15 49 views
1

只要线程中的run方法被调用,我的GUI就会冻结,有人知道为什么吗?使用GUI启动线程(Java)

主营:

public void run() { 
    while (true) { 
     System.out.println("test"); 
    } 
} 

ActionListener,用户应该启动线程:

private ActionListener btnStartListener = new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     robot.run(); 
    } 
}; 




public class RobotThread implements Runnable { 
@Override 
public void run() { 
    while (true) { 
     System.out.println("test"); 
    } 
} 

}

回答

5

这是因为从线程

try { 
     // Set System Look and Feel 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    } catch (UnsupportedLookAndFeelException e) { 
     // handle exception 
    } catch (ClassNotFoundException e) { 
     // handle exception 
    } catch (InstantiationException e) { 
     // handle exception 
    } catch (IllegalAccessException e) { 
     // handle exception 
    } 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       MainFrame frame = new MainFrame(null, null); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

run方法方法不会启动新的线程。假设您的robot引用是指Runnable的实例,则需要调用以下内容;

new Thread(robot).start(); 

调用start()将开始一个新的线程,并调用run()方法就可以了。目前您的run()方法正在从它调用的同一个线程上运行(在您的实例中为事件分派线程)。

+1

+1对于'run()'不启动一个新线程 - 但是由于swing是事件派发线程而不是主线程,这导致UI冻结。 –

+0

@ piet.t - 好点,我会更新我的答案。 –

+0

是的,机器人指的是一个Runnable的实例。我试过你的答案,但run()中的代码现在没有得到执行。 – user3742929