Java/Swing:快速/慢速UI绑定问题

Jas*_*n S 4 java swing binding

我需要一种方法将UI指标绑定到快速变化的值.

我有一个类NumberCruncher在一个关键的非UI线程中执行大量繁重的处理,每秒循环数千次迭代,其中一些导致我关注的一组参数的更改.(把它们想象成一个键值存储)

我想在UI线程中以较慢的速率显示那些; 10-20Hz就好了.如何添加MVC样式的通知,以便我的NumberCruncher代码不需要知道UI代码/绑定?

Ada*_*ski 5

执行此操作的惯用方法是使用SwingWorker该类,并使用调用来publish(V...)定期通知Event Dispatch线程,从而使其更新UI.

在以下来自Javadoc的示例中,数字运算在doInBackground()方法中的工作线程上进行,该方法在每次迭代时调用publish.此调用导致在Event Dispatch线程上异步调用process(V ...)方法,允许它更新UI.请注意,这可确保始终从Event Dispatch线程更新用户交互.另请注意,您可以选择每N次迭代调用发布,以降低用户界面更新的频率.

来自Javadoc的示例

 class PrimeNumbersTask extends 
         SwingWorker<List<Integer>, Integer> {
     PrimeNumbersTask(JTextArea textArea, int numbersToFind) { 
         //initialize 
     }

     @Override
     public List<Integer> doInBackground() {
         while (! enough && ! isCancelled()) {
                 number = nextPrimeNumber();
                 publish(number);
                 setProgress(100 * numbers.size() / numbersToFind);
             }
         }
         return numbers;
     }

     @Override
     protected void process(List<Integer> chunks) {
         for (int number : chunks) {
             textArea.append(number + "\n");
         }
     }
 }
Run Code Online (Sandbox Code Playgroud)