定期刷新JList中的项目(Java SWING)

时间:2014-04-29 02:11:58

标签: java swing jlist

我正在尝试编写一些Java代码来显示在线获得的问题列表。我有一个名为getQuestions的工作方法,它从我的服务器中提取并构建问题对象。我现在想要一个JList,它会在几秒钟内自动刷新所有问题的最新版本。如果我不在循环内运行updateQuestions,它可以正常工作,但只要我把它放在循环中,列表总是显示为空白。

我有一个名为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());
    }
}

我尝试了很多东西,包括重新制作/验证所有内容。有什么建议?有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

你的问题是你的Thread.sleep(...)while (true)循环都在捆绑Swing事件线程,阻止它完成绘制GUI和与用户交互的两个主要工作。这将有效地冻结您的GUI。

您可以使用Swing Timer来完成循环,而不会占用Swing事件线程,但是这不会解决从服务器上线和下载所需时间的问题。因此,我建议您使用后台线程,例如可以使用SwingWorker找到,以免绑定并冻结Swing事件线程。有关详细信息,请查看Concurrency in Swing