2011-08-29 2 views
6

GUI가 스윙을 기반으로하는 주 프로그램이 있으며 4 가지 상태 중 하나에 따라 GUI 요소에 다른 매개 변수가 있습니다.java (swing)의 다른 스레드에 의한 GUI 새로 고침

public class Frame extends JFrame implements Runnable { 
Status status = 1; 
... 
@Override 
public void run() { 
    switch (status) { 
     case 1: 
     ... 
     case 2: 
     ... 
} 

public void updateGUI(Status status) { 
    this.status = status; 
    SwingUtilities.invokeLater(this); 
} 

GUI를 새로 고치려면 적절한 매개 변수로 updateGUI 만 호출하면 모든 것이 정상입니다. 그러나 프로그램은 관련 데이터를 처리 한 후에 GUI 메인 프로그램을 변경해야하는 추가 스레드를 작성합니다. 불행히도이 스레드에서 updateGUI (..) 메서드를 호출 할 수 없습니다.

invokeLater 또는 SwingWorker를 사용하여 새로 고칠 수 있지만 10 개 이상의 요소가 있으므로 대신 udpateGUI() 메서드를 사용하는 것이 좋습니다.

나는 어떤 힌트에도 감사 할 것입니다.

+0

이 질문에서 이벤트 및 이벤트 버스에 대한 답변을 살펴보십시오. http://stackoverflow.com/questions/7131484/how-to-pass-the-message-from-working-thread-to -gui-in-java/7131574 # 7131574 –

+0

다른 스레드에서 updateGUI를 호출 할 수없는 이유는 무엇입니까? 상태 변수에 대한 비 동기화 된 액세스 외에도 다른 스레드에서이 메서드를 사용할 수없는 이유가 없습니다. 프레임을 호출하면 –

+0

f = new Frame(); f.udpateGUI (..); 물론 아무 일도 일어나지 않습니다. 어떻게 그 방법을 호출 할 수 있습니까? – galica

답변

7

, 당신은 당신의 배경 스레드에서 직접 setStatus를 호출 할 수 있습니다. 상태를 스레드로부터 안전하게 만들려면 변경 내용을 동기화 블록에 넣고 변수를 volatile로 만들어 다른 스레드의 업데이트를 표시하십시오.

예. 장소에서 이러한 변경으로

public class Frame extends JFrame implements Runnable { 
private volatile Status status = 1; 
... 
@Override 
public void run() { 
    switch (status) { 
     case 1: 
     ... 
     case 2: 
     ... 
} 

public void updateGUI(Status status) { 
    setStatus(status); 
    SwingUtilities.invokeLater(this); 
} 

private synchronized void setStatus(Status status) { 
    this.status = status; 
} 

, 그것은 모든 스레드에서 setStatus 전화를 확인합니다.

16

다음은 GUI 스레드에서 실행되도록 메소드에 추가 할 수있는 약간의 스 니펫입니다. 그것은 isEventDispatchThread()에 의존합니다. 당신이 status 필드는 스레드로부터 안전 할 경우

public void updateGUI(final Status status) { 
    if (!SwingUtilities.isEventDispatchThread()) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      updateGUI(status); 
     } 
    }); 
    return; 
    } 
    //Now edit your gui objects 
    ... 
} 
+0

덕분에 도움이되었습니다. – galica