代码之家  ›  专栏  ›  技术社区  ›  Amit

Java-SwingWorker-problem in process()方法

  •  3
  • Amit  · 技术社区  · 15 年前

    javax.swing.SwingWorker 第一次。

    我想更新一个 JLabel 根据swing worker发布的中期结果,如下所示:

    publish("Published String");
    

    现在更新 ,我对以下内容进行了编码:

    process(List<String> chunks) {
        if (chunks.size() > 0) {
            String text = chunks.get(chunks.size() - 1);
            label.setText(text);
        }
    }
    

    上面的代码可以工作,但我的问题(或者更具体地说,我的疑问)如下:

    上面的swing worker任务是一个注释性的内部类,因此它可以访问 label 现场。

    标签 作为swing worker类的构造函数的参数,以便process()方法可以访问。

    还是有别的办法?

    当swing worker类不是内部类时,其他开发人员采用什么方法从swing worker类的结果更新UI组件?

    1 回复  |  直到 15 年前
        1
  •  4
  •   Cesar    15 年前

    但是如果我想荡秋千呢 我需要把label作为参数传递给 swing工人类的构造函数 以便process()方法 进入。

    SwingWorker documentation

    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");
            }
        }
    }
    
    JTextArea textArea = new JTextArea();
    final JProgressBar progressBar = new JProgressBar(0, 100);
    PrimeNumbersTask task = new PrimeNumbersTask(textArea, N);
    task.addPropertyChangeListener(
        new PropertyChangeListener() {
            public  void propertyChange(PropertyChangeEvent evt) {
                if ("progress".equals(evt.getPropertyName())) {
                    progressBar.setValue((Integer)evt.getNewValue());
                }
            }
        });
    
    task.execute();
    

    注意建造师 PrimeNumbersTask(JTextArea textArea, int numbersToFind) JTextArea 更新。