繁体   English   中英

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

[英]Periodically Refresh Items in JList (Java SWING)

我正在尝试编写一些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());
    }
}

我已经尝试了很多方法,包括重新粉刷/验证所有内容。 有什么建议么? 有一个更好的方法吗?

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

您可以使用Swing计时器进行循环而无需占用Swing事件线程,但这无法解决从服务器上线和下载所需的时间问题。 因此,我建议您为此使用一个后台线程(例如可以在SwingWorker中找到的后台线程),以免占用并冻结Swing事件线程。 在Swing中检查并发以获取更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM