6

SwingWorkerを使用してGUIのラベルとプログレスバーを更新するJavaアプリがあり、うまく機能します。ただし、この設定に機能を追加したいと思います。

私のSwingWorkerは、長さのあるタスクを実行し、nそのタスクを繰り返しますm。現在、私のGUIは、タスクが繰り返された回数を教えてくれますが、タスクの長さも教えてもらいたいのです。言ってn=300みてください。m=50次のようにしたいと思います。

Task 49 is at 248 ()
Task has been repeated 48 times

SwingWorkerで何を変更する必要がありますか?

/**
 *
 * @author digitaldust
 */
public class Model extends SwingWorker<Integer, Integer> {

    private HashMap<String, Number> GUIparams;
    private int session;
    private int ticks;

    Model(HashMap<String, Number> KSMParams) {
        GUIparams = KSMParams;
        session = (Integer)GUIparams.get("experimentsInSession");
        ticks = (Integer)GUIparams.get("howManyTicks");
    }

    /**
     * Actual simulation
     */
    @Override
    protected Integer doInBackground() throws Exception {

        int i=0;
        while(!isCancelled() && i<session){
            i++;
            int ii=0;
            while(!isCancelled() && ii<ticks){
                // this is n, the task length and I'd like to update the GUI with this value
                ii++;
            }
            System.out.println(i);
            // this is m, how many time the task has been repeated, and now it is updated in the GUI
            publish(i);
            setProgress(i);
            Thread.sleep(1000);
        }
        return i;
    }  

    /**
     * Invoked when simulation exits
     */
    @Override
    protected void done() {
        if (isCancelled()) {
            Logger.getLogger(Model.class.getName()).log(Level.WARNING, "Experiment session cancelled by user. Closing Session...");
        } else {
            // do stuff

            Logger.getLogger(Model.class.getName()).log(Level.WARNING, "Experiment session ended.");
        }
    }

}
4

1 に答える 1

7

2番目のタイプパラメータSwingWorker<T,V>Vinは、このSwingWorkerのpublishメソッドとprocessメソッドによる中間結果を実行するために使用されます。これはカスタムクラスである可能性があります。投稿されたSSCCE(わかりやすくするために短縮)に基づく例を次に示します。

class Progress {
    private int task;
    private int element;

    public Progress(int task, int element) {
        super();
        this.task = task;
        this.element = element;
    }
        ...
}

public class Model extends SwingWorker<Integer, Progress> {
    ...
    @Override
    protected Integer doInBackground() throws Exception {
            ...
            publish(new Progress(i, ii));
        }
}

編集:プロセスメソッドの実装例

@Override
protected void process(List<Progress> progressList) {
    for (Progress p : progressList){
        System.out.println(p.getTask() + " : " + p.getElement());
    }
}

編集:UIアップデートの例

これは、 SwingWorkerのマニュアルに示されているサンプルと同様に、ワーカー実装のわずかに変更されたバージョンです。唯一の変更は、textAreaメンバーの紹介とでの更新されたsetProgress()呼び出しですdoInBackground()progressプロパティは、進行状況バーを更新するためにprocess()使用され、テキスト領域を更新するために使用されます。

public static class Model extends SwingWorker<Integer, Progress> {

    private HashMap<String, Number> GUIparams;
    private int session;
    private int ticks;
    private JTextArea textArea;

    Model(HashMap<String, Number> KSMParams, JTextArea textArea) {
        GUIparams = KSMParams;
        session = (Integer)GUIparams.get("experimentsInSession");
        ticks = (Integer)GUIparams.get("howManyTicks");

        this.textArea = textArea;
    }

    @Override
    protected void process(List<Progress> progressList) {
        for (Progress p : progressList){
            textArea.append(p.getTask() + " : " + p.getElement() + "\n");
            System.out.println(p.getTask() + " : " + p.getElement());
        }
    }

    /**
     * Actual simulation
     */
    @Override
    protected Integer doInBackground() throws Exception {

        int i=0;
        while(!isCancelled() && i<session){
            i++;
            int ii=0;
            while(!isCancelled() && ii<ticks){
                // this is n, the task length and I'd like to update the GUI with this value
                ii++;
            }
            //System.out.println(i);
            // this is m, how many time the task has been repeated, and now it is updated in the GUI
            publish(new Progress(i, ii));
            //setProgress(i);
            setProgress(100 * i / session);
            Thread.sleep(1000);
        }
        return i;
    }  

    /**
     * Invoked when simulation exits
     */
    @Override
    protected void done() {
        if (isCancelled()) {
            Logger.getLogger(Model.class.getName()).log(Level.WARNING, "Experiment session cancelled by user. Closing Session...");
        } else {
            // do stuff

            Logger.getLogger(Model.class.getName()).log(Level.WARNING, "Experiment session ended.");
        }
    }
}

デモの初期化は次のとおりです。

final JProgressBar progressBar = new JProgressBar(0, 100);
final JTextArea textArea = new JTextArea();
final JButton button = new JButton("Start");

button.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e) {
        HashMap<String, Number> map = Maps.newHashMap();
        map.put("experimentsInSession", 10);
        map.put("howManyTicks", 5);

        Model task = new Model(map, textArea);
        task.addPropertyChangeListener(
                 new PropertyChangeListener() {
                     public  void propertyChange(PropertyChangeEvent evt) {
                         if ("progress".equals(evt.getPropertyName())) {
                             progressBar.setValue((Integer)evt.getNewValue());
                         }
                     }
                 });
        task.execute();
    }
});
于 2012-06-14T14:48:18.410 に答える