2014-04-29 2 views
1

온라인에서 얻은 일련의 질문을 표시하는 Java 코드를 작성하려고합니다. getQuestions라는 작업 메서드가 있는데, 이는 내 서버에서 가져 와서 질문 객체를 빌드합니다. 이제 모든 질문에 대해 최신 정보를 얻기 위해 몇 초마다 자동으로 새로 고치는 JList가 필요합니다. 루프 내부에 updateQuestions를 실행하면 제대로 작동하지만 루프에 넣으면 목록이 항상 비어있게됩니다.주기적으로 JList에서 아이템을 새로 고침 (Java SWING)

저는 updateQuestions()라는 메서드를 사용하여 새로운 배열 목록을 가져 와서 JList에 설정합니다. 한 번 실행하면 정상적으로 작동합니다. 그러나, 내가 같은 내 메인에 넣을 때 :

listModel=new DefaultListModel(); 
questionList = new JList(listModel); 
questionFeedFrame.add(questionList); 
questionFeedFrame.pack(); 
questionFeedFrame.setVisible(true); 
while(true){ 
    try{ 
      updateQuestions(id); 
      Thread.sleep(10000); 
    }catch (Exception ee){ 
       ee.printStackTrace(); 
      } 
      } 


public static void updateQuestions(int id){ 
    listModel = (DefaultListModel) questionList.getModel(); 
    listModel.removeAllElements(); 
    ArrayList<Question> questions = getQuestions(id); 
    for(Question q : questions){ 
     listModel.addElement(q.getQuestion()); 
    } 
} 

나는 repaint/validate하는 것을 포함하여 많은 것을 시도했다. 어떤 제안? 이 작업을 수행하는 더 좋은 방법이 있습니까?

답변

2

Thread.sleep(...)while (true) 루프가 모두 Swing 이벤트 스레드를 묶어서 GUI 그리기와 사용자 상호 작용이라는 두 가지 주요 작업을 수행하지 못하게하는 것이 문제입니다. 이것은 GUI를 효과적으로 고정시킵니다.

스윙 타이머를 사용하여 스윙 이벤트 스레드를 묶지 않고도 루프를 수행 할 수는 있지만 온라인 상태가되어 서버에서 다운로드하는 데 필요한 시간 문제는 해결되지 않습니다. 따라서 대신 SwingWorker에서 찾을 수있는 배경 스레드를 사용하여 Swing 이벤트 스레드를 묶어 고정하지 않는 것이 좋습니다. 자세한 내용은 Concurrency in Swing을 확인하십시오.

+0

대단히 감사합니다! – user2316901

+0

@ user2316901 : 환영합니다.하지만주의해야합니다. Swing 이벤트 스레드에서만 Swing 속성을 업데이트해야합니다. 이것이 SwingWorker가 이것을 쉽게하기위한 프레임 워크를 가지고 있기 때문에 더 좋은 해결책 일 것입니다. –

관련 문제