2013-04-23 72 views
0

我很困惑。通過廣泛的測試,我可以確認,如果我將對象比y更快地添加到連接到JList的DefaultListModel,JList消失。JLists有沒有速度限制?

下面是我在做什麼:

JPanel pane = new JPanel(new BorderLayout()); 
JList<LogMessage> messageList = new JList<LogMessage>(dataModel.getMessageList()); 
pane.add(messageList , BorderLayout.CENTER); 

//add pane to JFrame etc. 

初始化GUI之後,我加100個日誌消息到DefaultListModel。奇怪的是,一切工作,如果我做Thread.sleep(10); 100個新LogMessage之間。如果我不這樣 - JList消失。

我試圖導出爲可運行的jar並運行它 - 問題沒有了。我仍然需要能夠從eclipse運行我的程序。

這可能是什麼原因造成的?

+1

你在Swing事件線程加入到'ListModel'? – 2013-04-23 19:59:40

+0

史蒂夫:不,我在啓動時做所有事情。 – Emiam 2013-04-23 20:01:46

+0

這很可能是您的問題。看看'SwingUtilities.invokeLater' http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingUtilities.html#invokeLater(java.lang.Runnable) – 2013-04-23 20:04:53

回答

3

所有Swing組件只能在Event Dispatch Thread或簡稱爲EDT上訪問。如果沒有,那麼你違反了擺動線程原則,並且你可能會遇到像你得到的那樣的奇怪錯誤。

要發佈一個任務(即一Runnable)排隊到上EDT運行使用SwingUtilities.invokeLater