Я пытаюсь реализовать Пассив Просмотр системы графического интерфейса в разгаре. По сути, я хочу, чтобы моя реализация представления (часть, которая фактически содержит свинг-код) была минимальной, и выполняю большую часть работы в своем классе Presenter. докладчик не должен зависеть от свинга, а также должен «запускать шоу», то есть сообщать представлению, что делать, а не наоборот.
Я сталкиваюсь с проблемами при работе с долго выполняющимися задачами и разделением потоков в целом. Я хочу, чтобы обновления GUI выполнялись на EDT, а логика докладчика - в другом потоке. Если я хочу, чтобы докладчик обновил некоторую часть графического интерфейса, это довольно просто, я пишу что-то вроде этого:
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);
}
});
}
}
Однако, когда графический интерфейс должен информировать докладчика о том, что произошло какое-то действие, я хочу отключить 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. Я знаю, что у Swing есть концепция SwingWorker - запуск задач в другом потоке, однако, похоже, мне придется вставить свинг-код в докладчика, и представление запускает шоу. Есть идеи как это решить?