0

SwingWorkerそのコードが現在実行されていることをどのように取得しますか?Thread.currentThread()インスタンスを取得するために使用できますが、Threadインスタンスが必要SwingWorkerです。

コメントからのコード

private static void loadFeaturesForSym(final SeqSymmetry optimized_sym, 
                                       final GenericFeature feature) 
  throws OutOfMemoryError { 
  final CThreadWorker<Boolean, Object> worker = 
     new CThreadWorker<Boolean, Object>("Loading feature " + feature.featureName) { 
         @Override 
         protected Boolean runInBackground() { 
           try { 
             return loadFeaturesForSym(feature, optimized_sym); 
           } catch (Exception ex) { 
             ex.printStackTrace(); 
           } 
           return false; 
         } 
       }; 
       ThreadHandler.getThreadHandler().execute(feature, worker); 
     } 
   }
4

1 に答える 1

2

SwingWorker が listen できるモデル・オブジェクトを作成し、これらの更新を publish および process メソッドから送信することをお勧めします。他のオブジェクトは SwingWorker について知る必要はありません。自分の進行状況を把握し、聞きたい人に公開する必要があります。デカップリングといいます。これは、MVC に近づくものを使用するための 1 つのアイデアです。私はこのコードをコンパイルしていませんが、私が話していることを説明するのに役立ちます。

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

public class ProcessStatus {
    public static final String PROGRESS = "Progress";

    private PropertyChangeSupport propertyChangeSupport;

    private int progress = 0;

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }

    protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
        propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
    }

    public void setProgress(int progress) {
        int oldProgress = progress;
        this.progress = progress;
        firePropertyChange(PROGRESS, oldProgress, progress);
    }

    public int getProgress() {
        return progress;
    }
}

public class SomeWorker extends SwingWorker implements PropertyChangeListener {
    public void doInBackground() {
        ProcessStatus status = new ProcessStatus();
        status.addPropertyChangeListener(this);
        ProcessorThingy processor = new ProcessorThingy(status);
        processor.doStuff();
    }

    public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getPropertyName().equals(ProcessStatus.PROGRESS)) {
            publish((Integer) evt.getNewValue());
        }
    }
}

public class ProcessorThingy {
    private ProcessStatus status;

    public ProcessorThingy(ProcessStatus status) {
        this.status = status;
    }

    public void doStuff() {
        //stuff part 1
        status.setProgress(10);
        //stuff part 2
        status.setProgress(50);
        //stuff part 3
        status.setProgress(100);
    }
}
于 2012-04-27T16:18:02.590 に答える