我希望用多个线程填充 JList。 我尝试了这种方法,但 jlist 是空的。 如果 jlist 能动态更新就好了 有两个线程,另一个在另一个方向加载
new Thread(new Runnable() {
@Override
public void run() {
for(i=0; i<cells.size()/2; i++){
System.out.println("thread");
try{
HtmlPage p = client.getPage("https://tbilisi.embassytools.com/en/slotsReserve?slot="+cells.get(i).getAttribute("data-slotid"));
pages.add(p);
if(!p.getUrl().toString().contains("slotsReserve"))
model.add(i,p.getUrl().toString());
}
catch (Exception e){
e.printStackTrace();
}
}
}
});
list1.setModel(model)
提前致谢
更新* 所以我使用 SwingWorker 修复了
最佳答案
Swing 是一个单线程框架,也就是说,对 UI 的所有更新和修改都应该在事件调度线程的上下文中完成。
同样,您不应在 EDT 中执行任何可能阻止或阻止其处理事件队列的操作(例如从 Web 下载内容)。
这提出了一个难题。无法在 EDT 之外更新 UI,需要使用某种后台进程来执行耗时/阻塞任务...
只要项目的顺序不重要,您就可以使用多个 SwingWorker
来代替 Thread
,例如...
DefaultListModel model = new DefaultListModel();
/*...*/
LoadWorker worker = new LoadWorker(model);
worker.execute();
/*...*/
public class LoaderWorker extends SwingWorker<List<URL>, String> {
private DefaultListModel model;
public LoaderWorker(DefaultListModel model) {
this.model = model;
}
protected void process(List<String> pages) {
for (String page : pages) {
model.add(page);
}
}
protected List<URL> doInBackground() throws Exception {
List<URL> urls = new ArrayList<URL>(25);
for(i=0; i<cells.size()/2; i++){
try{
HtmlPage p = client.getPage("https://tbilisi.embassytools.com/en/slotsReserve?slot="+cells.get(i).getAttribute("data-slotid"));
pages.add(p);
if(!p.getUrl().toString().contains("slotsReserve")) {
publish(p.getUrl().toString());
urls.add(p.getUrl());
}
}
catch (Exception e){
e.printStackTrace();
}
}
return urls;
}
}
这允许您在后台执行阻塞/长时间运行 (doInBackground
) 并发布
此方法的结果,然后在 EDT 的上下文中处理
...
参见Concurrency in Swing了解更多详情
关于java - 使用线程填充 JList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19038721/