2013-06-02 74 views
1

我有一個對象數組。這些對象很簡單,只有兩個字符串。我有一個toString()方法,它只返回其中一個字符串。如何從一個對象數組中創建一個GUI列表?

我需要採取該對象的數組,並使其成爲一個可見的GUI列表,以便用戶可以選擇其中之一。

在主要我採取一個長字符串,並將其發送給一個方法,解析它並返回一個我的對象數組。然後,我創建一個新的JList,將其添加並使其可見:

JList list = new JList(objects); 
list.setVisible(true); 
add(list); 

但是,沒有顯示任何內容。此時我已經在屏幕上顯示了一個GUI。實際上,上面代碼包含的類擴展了JPanel。我不確定爲什麼我沒有看到任何東西,所以我認爲我做錯了什麼。

編輯* *

好了,所以我的問題是,我沒有設定一個模型。但是,設置模型後,我仍然沒有得到任何結果。繼承人代碼即時通訊使用:

  ScratchItem[] items = listPlaylists(line2); 

      DefaultListModel newListModel = new DefaultListModel(); 
      for(ScratchItem item : items) { 
       newListModel.addElement(item); 
      } 

      JList list = new JList(); 
      list.setModel(newListModel); 
      list.setVisible(true); 
      add(list, BorderLayout.SOUTH); 
      invalidate(); 
+0

你需要使jpanel無效,所以它被取消 –

+0

我添加了代碼行 invalidate() 添加列表後,沒有發生什麼不同。 – TyP

+0

通常'revalidate();重繪();'爲我工作。 – wchargin

回答

2

而不是改變JLists,保持相同的JList,但只是改變模型。如果您使用新字符串填充DefaultListModel並在JList上調用setModel(...),則應該很好。

例如,

DefaultListModel newListModel = new DefaultListModel(); 
for (String text : newStringArray) { 
    newListModel.addElement(text); 
} 
originalJList.setModel(newListModel); 

編輯

幽州:

我這樣做,但我仍然沒有得到任何東西。檢查我的更新問題

和:

好了,所以我的問題是,我沒有設定一個模型。但是,設置模型後,我仍然沒有得到任何結果。繼承人使用的代碼IM:

 ScratchItem[] items = listPlaylists(line2); 

     DefaultListModel newListModel = new DefaultListModel(); 
     for(ScratchItem item : items) { 
      newListModel.addElement(item); 
     } 

     JList list = new JList(); 
     list.setModel(newListModel); 
     list.setVisible(true); 
     add(list, BorderLayout.SOUTH); 
     invalidate(); 

你還在創建 JList的。不要這樣做,而應按照我們的建議,使用原始 JList。

ScratchItem[] items = listPlaylists(line2); 

DefaultListModel newListModel = new DefaultListModel(); 
for(ScratchItem item : items) { 
    newListModel.addElement(item); 
} 

// JList list = new JList(); // *** don't create a new JList 

// originalList refers to the original displayed JList 
originalList.setModel(newListModel); 

// list.setVisible(true); 
// add(list, BorderLayout.SOUTH); 
// invalidate(); 

編輯2
幽州的評論:

沒有原來的JList。這是我在程序中創建的第一個。我應該只在構造函數中添加一個,那麼這裏只需更改模型和setVisible(true)?

然後事情變得越來越複雜。您的問題中的更新代碼如果其他所有內容都是正確的,則表明其他所有內容都不正確。根據目前爲止發佈的代碼片段,很難說什麼是錯誤的。我的建議:

  • 首先,如果您需要在Swing GUI中交換視圖,請考慮使用CardLayout,因爲這可以使交換變得更容易。其次,如果你與當前的結構綁定,那麼你需要展示更多的代碼,最好是發佈一個代碼示例來演示你的問題,SSCCE。這將允許我們運行你的代碼並修改它,甚至可以糾正它。請在回覆之前閱讀鏈接,因爲它提供了關於SSCCE要求的許多重要細節。
+0

我這樣做了,但我還沒有得到任何東西。檢查我更新的問題。 – TyP

+0

@ EW-CodeMonkey:請參閱編輯以回答。 –

+0

沒有原始的JList。這是我在程序中創建的第一個。我應該只在構造函數中添加一個,那麼這裏只需更改模型和setVisible(true)? – TyP

3

通常

revalidate(); 
repaint(); 

爲我工作。第一行再次放置容器,第二行重新繪製它(您也可以通過調整窗口大小來獲得第二個效果)。

但是,您應該更改基礎模型,而不是每次都更換列表。

"How to Use Lists"開始,部分"Creating a Model"將幫助您開始使用列表模型。

+0

AHHHH。謝謝,我想出了問題。這是因爲我從來不設置模型......非常感謝。 – TyP

+0

對不起,我拿起答案,因爲我仍然有麻煩。 – TyP

相關問題