这可能是一个基本问题,但我仍然坚持。我想从按钮单击事件中启动新线程(可运行)时为什么会阻止GUI的原因?以及我该如何克服?我究竟做错了什么?下面的代码在单击时启动了一个新线程,但是,当单击该按钮时,我想更改文本框的背景颜色,但是我无法做到这一点,而且在该线程运行时主用户界面也没有响应,我相信我通过启动一个新线程来正确实现它,从而不会阻塞主用户界面,但是我肯定错过了一些东西,因为这显然是不希望的行为。码:private void startButtonEvent(ActionEvent evt) { ntmStatusText.setBackground(Color.green);// textbackground I want to change //Start Ntm Thread Thread thread = new Thread(new NtmThread()); thread.start(); while(thread.isAlive()){ System.out.println("thread still working"); } System.out.println("thread stopped"); }运行线程时,如何阻止Ui变得无响应? 最佳答案 while(thread.isAlive()){是一种阻止方法,它将停止事件调度线程,直到Thread.isAlive变为false,这将阻止它处理已添加到事件队列中的新事件,包括绘画请求发生这种情况是因为Swing是一个单线程环境,这意味着只有一个线程负责处理进入程序的所有事件。这是由事件调度线程处理的。所有用户生成的事件都在EDT中进行管理(也就是说,在EDT的上下文中调用actionPerformed方法)Concurrency in Swing您可以进一步为NtmThread提供回调功能,或者考虑使用SwingWorker并将PropertyChanegListener附加到该属性上,以监视属性state并检查SwingWorker的状态是否已更改为有关更多详细信息,请参见Worker Threads and SwingWorker例如:How to use jProgress bar for ProcessBuilder process?
09-30 14:58
查看更多