3

javax.swing.SwingWorker初めて使用しています。

JLabel次のように、swing ワーカーによって公開された中間結果からa を更新したいと思います。

publish("Published String");

を更新するためJLabelに、次のようにコーディングしました。

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

上記のコードは機能しますが、私の問題 (より具体的には、私の疑問) は次のとおりです。

上記の Swing ワーカー タスクは匿名の内部クラスであるため、labelフィールドにアクセスできます。

しかし、swing ワーカー クラスを非インナー クラスにしたい場合はどうすればよいでしょうか。labelprocess() メソッドがアクセスできるように、swing ワーカー クラスのコンストラクターに引数として渡す必要がありますか。

または他の方法はありますか?

Swing ワーカー クラスが内部クラスでない場合、Swing ワーカー クラスの結果から UI コンポーネントを更新するために、他の開発者はどのようなアプローチに従いますか?

4

1 に答える 1

4

しかし、swing ワーカー クラスを非インナー クラスにしたい場合はどうすればよいでしょうか。process() メソッドがアクセスできるように、swing ワーカー クラスのコンストラクターに引数として label を渡す必要がありますか。

それはまったく問題ありません。SwingWorker のドキュメントから:

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て更新します。

于 2010-04-28T19:20:49.727 に答える