스윙에서 PassiveView 기반 GUI 시스템을 구현하려고합니다. 기본적으로 내 뷰 구현 (실제로 스윙 코드가 포함 된 부분)을 최소화하고 내 Presenter 클래스에서 대부분의 작업을 수행하려고합니다. 발표자는 스윙에 대한 의존성이 없어야하며 "쇼를 운영해야합니다"즉, 무엇을해야 할지를 뷰에 알려야하며 반대의 경우도해야합니다.스윙, 수동보기 및 장기 실행 작업
장기 실행 작업 및 일반적으로 스레드 분리를 처리 할 때 문제가 발생합니다. EDT에서 실행되는 GUI 업데이트와 발표자 로직을 다른 스레드에서 실행하고 싶습니다. 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의 일부를 업데이트 할 경우, 그 뭔가를 쓰기
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의 개념을 가지고 있다는 것을 알고 있습니다. 다른 스레드에서 작업을 실행하고 있지만, 발표자에게 스윙 코드를 삽입해야하며보기가 실행 중입니다. 어떤 아이디어가 이것을 해결하는 방법?
위와 비슷한 패턴을 사용하고 SwingWorker 스레드가 예상대로 작동합니다. +1 – Luhar
최적화 작업으로, 스윙 작업자 호출을 위해 새 스레드를 생성하는 대신 실행 프로그램을 사용하는 것이 좋습니다. –