使用Java保持响应式用户界面的提示

时间:2015-07-22 12:51:23

标签: java swing

在Swing响应中保持按钮和其他组件的最佳方法是什么。我总是使用" new Thread(){public void run(){}}。start();"在每个动作听众身上,但我不知道如何在不使用" Thread.stop()"的情况下停止或取消该主题。任何建议或提示?

2 个答案:

答案 0 :(得分:1)

我的经验法则只是SwingWorker,如果它是非常长时间运行的任务。通过长时间运行,我的意思几乎与应用程序的生命相同。因此,我几乎从不开始自己的线程。

为每个小操作启动一个线程是一个坏主意,因为Threads旋转起来很昂贵。通常的解决方案是使用ThreadPool重用线程,让您远离您的头痛。

但是随着时间的推移,还有一个final JLabel label; class MeaningOfLifeFinder extends SwingWorker<String, Object> { @Override public String doInBackground() { return findTheMeaningOfLife(); } @Override protected void done() { try { label.setText(get()); } catch (Exception ignore) { } } } SwingWorker<String, Object> worker = new MeaningOfLifeFinder(); worker.execute(); 的选项,它将在后台池线程上运行,并为您提供简单的方法来更新您的UI与正确线程中的任何结果。

来自https://docs.oracle.com/javase/8/docs/api/javax/swing/SwingWorker.html

worker.cancel(false);

取消

请参阅https://docs.oracle.com/javase/tutorial/uiswing/concurrency/cancel.html

取消摇摆工人很容易。 isCancelled()设置一个标记,您必须通过选中@Override public String doInBackground() { //somework if(isCancelled()) return ...; // check occasionally and return early when cancelled //somemorework return ...; } 来查找该标记。

{{1}}

答案 1 :(得分:0)

一种快速方法是简单地定期检查线程是否应该继续工作。像这样:

public void run(){

   doThingOne();

   if(cancelled){
      return;
   }

   doThingTwo();

   if(cancelled){
      return;
   }

   doThingThree();
}

然后,您只需要在标记为“取消”的按钮中取消线程时设置cancelled变量。

Google是您的朋友,但请参阅以下相关问题以获取更多信息:

How to stop, pause, cancel a thread in java

Java long running task Thread interrupt vs cancel flag

How do you kill a thread in Java?

How to properly stop the Thread in Java?

Java教程总是一个好看的地方:https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html