J'essaie de mettre en œuvre un PassiveView basé système gui en balançoire. Fondamentalement, je veux garder mon implémentation de vue (la partie qui contient réellement le code de swing) minimale, et faire la plupart du travail dans ma classe Presenter. Le Présentateur ne devrait pas avoir de dépendance vis-à-vis du swing et devrait également "lancer le show", c'est-à-dire dire à la vue quoi faire et non vice versa.Swing, Passive View et tâches de longue durée
Je rencontre des problèmes lorsque je fais face à des tâches de longue durée, et la séparation des threads en général. Je souhaite que les mises à jour de l'interface graphique s'exécutent sur l'EDT et que la logique du présentateur s'exécute sur un thread différent. Si je veux le présentateur de mettre à jour une partie de l'interface graphique, il est assez facile, j'écris quelque chose comme ça:
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);
}
});
}
}
Toutefois, lorsque l'interface graphique est d'informer le présentateur qu'une action a eu lieu, je veux ÉlimiMercure de l'EDT en réagir dans un autre thread:
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();
}
});
}
}
puisque le code actionPerformed est en cours d'exécution de l'EDT, il en sera le presenter.buttonPressed. Je sais que swing a le concept de SwingWorker - exécuter des tâches dans un thread différent, mais il semblerait que je devrais insérer du code swing dans mon présentateur, et la vue est en cours d'exécution du spectacle. Des idées pour résoudre ceci?
J'utilise un modèle similaire à celui ci-dessus, et les threads SwingWorker fonctionnent comme prévu. +1 – Luhar
En guise d'optimisation, je recommande d'utiliser un exécuteur au lieu de générer un nouveau thread pour chaque appel de travailleur. –