スイングでパッシブ ビューベースの GUI システムを実装しようとしています。基本的に、ビューの実装 (実際にスイング コードを含む部分) を最小限に抑え、Presenter クラスでほとんどの作業を行いたいと考えています。プレゼンターはスイングに依存してはならず、「ショーを実行」する必要があります。つまり、ビューに何をすべきかを伝え、その逆ではありません。
長時間実行されるタスクや、一般的なスレッドの分離を処理するときに問題が発生します。GUI の更新を EDT で実行し、プレゼンター ロジックを別のスレッドで実行する必要があります。プレゼンターに GUI の一部を更新してもらいたい場合は、非常に簡単です。次のように記述します。
public interface View {
void setText(String text);
}
public class Presenter {
View view;
...
public void setTextInVIew() {
view.setText("abc");
}
}
public class MyFrame implements View {
JTextField textField;
...
public void setText(final String text) {
SwingUtilities.InvokeLater(new Runnable() {
public void run() {
textField.setText(text);
}
});
}
}
ただし、何らかのアクションが発生したことを GUI がプレゼンターに通知する場合は、EDT から切り替えて、別のスレッドでそれに反応したいと考えています。
public class Presenter {
...
public void buttonPressed() {
// shouldn't run on EDT
}
}
public class MyFrame implements View {
JButton button;
public MyFrame() {
...
button.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
presenter.ButtonPressed();
}
});
}
}
actionPerformed コードは EDT から実行されているため、presenter.buttonPressed も同様です。スイングには SwingWorker の概念があることを知っています-別のスレッドでタスクを実行しますが、プレゼンターにスイングコードを挿入する必要があり、ビューがショーを実行しているようです。これを解決する方法はありますか?