gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:55:23 26 4
gpt4 key购买 nike

我正在尝试编写一些 Java 代码来拉取显示在线获取的问题列表。我有一个名为 getQuestions 的工作方法,它从我的服务器中提取并从中构建问题对象。我现在想要一个 JList 每隔几秒自动刷新一次,以了解所有问题的最新情况。如果我不在循环内运行 updateQuestions,它工作正常,但一旦我将其放入循环中,列表总是显示为空白。

我有一个名为 updateQuestions() 的方法,它获取新的问题数组列表,然后将它们设置到 JList 中。如果我运行一次,效果很好。然而,当我把它放在我的 main 中时:

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 并与用户交互。这将有效地卡住您的 GUI。

您可以使用 Swing 计时器来执行循环,而无需占用 Swing 事件线程,但这并不能解决上网和从服务器下载所需时间的问题。因此,我建议您为此使用后台线程(例如 SwingWorker 中的后台线程),以免占用和卡住 Swing 事件线程。请查看Concurrency in Swing了解更多相关信息。

关于java - 定期刷新 JList 中的项目 (Java SWING),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23354302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com