У меня повторяющаяся проблема, когда у меня есть JList, который я хочу обновить с новым содержимым.Я использую DefaultListModel, который предоставляет методы для добавления нового контента в список, но при использовании этих методов я обнаружил, что некоторая доля вызовов приводит к совершенно пустому JList.Работает ли обновление, кажется, случайным и не связано с отправляемыми данными.
Ниже приведена простая программа, которая демонстрирует проблему.Он просто генерирует список увеличивающегося размера для обновления 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);
}
}
Любые указатели будут очень кстати.