5

こんにちは、swingworkerthread から jtextarea にテキストを追加する最良の方法を知りたいのですが、jbutton が Threadsclass().execute(); によって呼び出す別のクラスを作成しました。スレッドはこのコードで正常に並列実行されます

public class Threadsclass extends SwingWorker<Object, Object> {


@Override
protected Object doInBackground() throws Exception {
    for(int x = 0; x< 10;x++)
        try {
            System.out.println("sleep number :"+ x);



        Thread.sleep(1000);
    } catch (InterruptedException ex) {
        Logger.getLogger(eftcespbillpaymentsThreads.class.getName()).log(Level.SEVERE, null, ex);
    }
    throw new UnsupportedOperationException("Not supported yet.");
}

}

今私がやりたいことは、x の値をメイン GUI のテキスト領域に追加することです。どんなアイデアでも大歓迎です。

4

2 に答える 2

9

JavaDocsからの優れた例があります

class PrimeNumbersTask extends
        SwingWorker<List<Integer>, Integer> {

    PrimeNumbersTask(JTextArea textArea, int numbersToFind) {
        //initialize
    }

    @Override
    public List<Integer> doInBackground() {
        List<Integer> numbers = new ArrayList<Integer>(25);
        while (!enough && !isCancelled()) {
            number = nextPrimeNumber();
            numbers.add(number);
            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();
System.out.println(task.get()); //prints all prime numbers we have got

パブリッシュプロセスを見てみましょう

基本的な意図は、イベント ディスパッチ スレッド内からのみ UI を更新する必要があるということです。publishメソッドを介して更新するデータを UI に渡すことで、EDT のコンテキスト内でユーザーをSwingWorker呼び出します。process

于 2013-06-05T11:02:45.930 に答える
5

内では、にデータを送信するためdoInBackground()に使用します。publish(V... chunks)process(List<V> chunks)

于 2013-06-05T10:57:51.330 に答える