我正在尝试编写一些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());
}
}
我尝试了很多东西,包括重新制作/验证所有内容。有什么建议?有更好的方法吗?
答案 0 :(得分:2)
你的问题是你的Thread.sleep(...)
和while (true)
循环都在捆绑Swing事件线程,阻止它完成绘制GUI和与用户交互的两个主要工作。这将有效地冻结您的GUI。
您可以使用Swing Timer来完成循环,而不会占用Swing事件线程,但是这不会解决从服务器上线和下载所需时间的问题。因此,我建议您使用后台线程,例如可以使用SwingWorker找到,以免绑定并冻结Swing事件线程。有关详细信息,请查看Concurrency in Swing。