我有一個反覆出現的問題,我有一個JList,我希望用新內容更新。我使用了一個DefaultListModel,它提供了向列表中添加新內容的方法,但是當使用這些方法時,我發現某些比例的調用會導致完全空白的JList。更新是否工作似乎是隨機的,並且與發送的數據無關。爲什麼我在通過列表模型更新內容後有時會出現空白的JLists?
下面是一個簡單的程序,它演示了這個問題。它只是生成一個增加大小的列表來更新JList,但是當運行時,列表內容看起來隨機出現和消失。
據我可以告訴我正在遵循正確的API來做到這一點,但我想必須有一些基本的東西我想念。
import java.awt.BorderLayout;
import javax.swing.*;
public class ListUpdateTest extends JPanel {
private JList list;
private DefaultListModel model;
public ListUpdateTest() {
model = new DefaultListModel();
list = new JList(model);
setLayout(new BorderLayout());
add(new JScrollPane(list),BorderLayout.CENTER);
new UpdateRunner();
}
public void updateList (String [] entries) {
model.removeAllElements();
for (int i=0;i<entries.length;i++) {
model.addElement(entries[i]);
}
}
private class UpdateRunner implements Runnable {
public UpdateRunner() {
Thread t = new Thread(this);
t.start();
}
public void run() {
while (true) {
int entryCount = model.size()+1;
System.out.println("Should be "+entryCount+" entries");
String [] entries = new String [entryCount];
for (int i=0;i<entries.length;i++) {
entries[i] = "Entry "+i;
}
updateList(entries);
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {}
}
}
}
public static void main (String [] args) {
JDialog dialog = new JDialog();
dialog.setContentPane(new ListUpdateTest());
dialog.setSize(200,400);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setModal(true);
dialog.setVisible(true);
System.exit(0);
}
}
任何指針都會受到歡迎。
但再次與睡眠(int); – mKorbel 2011-05-06 13:32:41
是的,但那個睡眠不接觸EDT或主線程,它暫停了Swing Worker線程。所以沒有凍結或空的屏幕。 – dhblah 2011-05-06 13:34:16
+1我相信這是如何正確委託這樣的工作流程。 – mre 2011-05-06 13:47:32