새로운 내용으로 업데이트하려는 JList가있는 곳에서 반복되는 문제가 있습니다. 나는 목록에 새 내용을 추가하는 메소드를 제공하는 DefaultListModel을 사용하고 있지만 이러한 메소드를 사용하면 호출의 일부분이 완전히 빈 JList가됩니다. 업데이트 작동 여부가 무작위로 전송 된 데이터와 관련이없는 것으로 보입니다.목록 모델을 통해 내용을 업데이트 한 후 때때로 빈 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);
}
}
모든 포인터는 매우 환영받을 것입니다. 스윙에 대한 무효 updateList (...)하지만 난 sleep(int)
놓친 내부를 호출하지
다시 수면 (정수); – mKorbel
그래, 그 잠은 EDT 또는 메인 스레드를 만지지 않습니다, 그것은 스윙 워커 스레드를 일시 중지합니다. 따라서 화면이 정지되거나 화면이 비어 있지 않습니다. – dhblah
+1 이것이 워크 플로우를 적절히 위임하는 방법이라고 생각합니다. – mre