JLabel이 포함 된 모달 대화 상자가 있습니다. 이 대화 상자는 장기 실행 조회 활동을 수행하는 다른 클래스의 메소드를 호출합니다. 이 조회 클래스가 모달 대화 상자에서 전달되는 JLabel을 업데이트하고 싶습니다.모달 대화 상자에서 JLabel 업데이트 시도
조회 프로세스 및 타이머 내에서 코드 루프에서 JLabel을 업데이트 해 보았습니다. (모달 대화 상자가 실행될 때 Swing 타이머의 actionPerformed 메서드가 호출되지 않는다는 것을 알았습니다.) Timer를 구현 한 이후로, 내 조회 프로세스를 별도의 스레드로 옮겼습니다.
내 조회가 작동하지만 JLabel은 프로세스가 끝날 때까지 다시 그려지지 않습니다. 어떤 도움을 주셔서 감사합니다.
다음은 관련 방법입니다. DictionaryTuple은 List와 String이라는 두 개의 필드를 포함하는 POJO입니다. 그냥 getters 및 setters,하지만 dictionaryThread tupleList에 대한 액세스 권한이; dictionaryThread가 끝날 때까지 여기에 손을 대지 않는다.
public List<DictionaryTuple> findTuples() {
tupleList = new ArrayList<DictionaryTuple>();
Thread dictionaryThread = new Thread(this); // This is the long-running lookup thread
dictionaryThread.start();
progressTimer = new Timer();
progressTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// progressCaption is updated in dictionaryThread
synchronized (progressCaption) {
lblProgress.setText(progressCaption);
}
lblProgress.repaint();
Thread.yield();
}
}, 250, 250);
try {
dictionaryThread.join();
} catch (InterruptedException e) {
} finally {
progressTimer.cancel();
lblProgress.setText("");
progressCaption = "";
}
return tupleList;
}
이 변형을 시도해 보았습니다. - 전이나 후입니다
progressTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
synchronized (progressCaption) {
System.out.println("Fire!");
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
System.out.println("Update");
lblProgress.setText(progressCaption);
lblProgress.repaint();
}});
}
}
}, 250, 250);
공정한 질문입니다. 두 개의 필드를 포함하는 POJO입니다 : List과 String. 그냥 getters와 세터. –
Elly
감사합니다. 나는 당신이 아직 대답을 받아들이지 않았다는 것을 언급했다. 문제가 해결 되었습니까? 그렇지 않은 경우 문제 행동을 나타내는 [SSCCE] (http://sscce.org/)를 게시하는 것이 좋습니다. –