2012-09-18 21 views
5

我有一個類型爲cd的對象ArrayList。我想將所有對象添加到JList並向用戶顯示名稱的字段。我可以將String類型添加到JList,但是對象的特定字段呢?如何將對象添加到JList並將列表接口上的對象的成員顯示給用戶?

CD是:

class CD{ 
    public CD(String n){name = n;} 
    private String name; 
    public String getName(){return name;} 
    public void setName(String n){name = n;} 
} 

的ArrayList是:

ArrayList<CD> myList = new ArrayList<CD>(); 

現在我想myList中添加一個JList:

JList list = new JList(myList); 
panel.add(list); 
JScrollPane scrol = new JScrollPane(list); 
frame.add(scrol,BorderLayout.EAST); 
frame.add(panel); 
frame.setVisible(true); 

首先是這種方式正確?其次,我如何顯示列表中的對象的用戶名字段?我想要的界面:

enter image description here

左邊是我的對象的名字! 在此先感謝。 伯納德

+0

我明白擺動。我不明白這個問題。 – user1329572

+0

我認爲你發佈的代碼不正確(不可編譯)... //編輯:好的,也許它是正確的。 – m4tx

+0

@ user1329572讓你不懂擺動。 – Juvanis

回答

9

使用基於該DefaultListCellRenderer定製呈現:

import java.awt.Component; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Vector; 

import javax.swing.DefaultListCellRenderer; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 

public class TestJList { 

    class CD { 
     public CD(String n) { 
      name = n; 
     } 

     private String name; 

     public String getName() { 
      return name; 
     } 

     public void setName(String n) { 
      name = n; 
     } 
    } 

    protected void initUI() { 
     List<CD> cds = new ArrayList<CD>(); 
     cds.add(new CD("MJ - Bad")); 
     cds.add(new CD("Mozart - Concerto 123")); 
     cds.add(new CD("Nadeah - Odile")); 
     JFrame frame = new JFrame(TestJList.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JList list = new JList(new Vector<CD>(cds)); 
     list.setVisibleRowCount(10); 
     list.setCellRenderer(new DefaultListCellRenderer() { 
      @Override 
      public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
       Component renderer = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
       if (renderer instanceof JLabel && value instanceof CD) { 
        // Here value will be of the Type 'CD' 
        ((JLabel) renderer).setText(((CD) value).getName()); 
       } 
       return renderer; 
      } 
     }); 
     frame.add(new JScrollPane(list)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestJList().initUI(); 
      } 
     }); 
    } 
} 
+0

謝謝你,現在我可以理解我們設置值必須顯示在列表中的位置。偉大的工作夥伴。 – Bernard

+0

@Bernard不客氣。當然,可以隨意在getListCellRendererComponent方法內做任何你想做的事情,並設置你想要的任何文本。你也可以自己實現ListCellRendererComponent,並選擇返回你喜歡的任何組件(你可以有一個複雜的JPanel嵌入標籤,圖像等等) –

3

我認爲,如果你想用CD類的工作直接與JList,你需要編寫自己的渲染,將與CD類的工作。渲染器可以擴展JLabel並顯示name字段的內容。

還有其他方法:for()重複通過ArrayList並僅將name字段添加到DefaultListRenderer。你會這樣做的方式是你的選擇。

您還可以添加ListSelectionListener以顯示所選列表項的專輯詳細信息。

所有你需要知道的是在這裏:

//感謝克列奧帕特拉:)

+0

感謝您的回覆,我非常喜歡揮杆,這個例子很複雜。我無法理解它:http://docs.oracle.com/javase/7/docs/api/javax/swing/ListCellRenderer.html – Bernard

+0

是的,Swing中的渲染器有點難以理解。你看到了這個:http://docs.oracle.com/javase/tutorial/uiswing/components/list.html#renderer?我認爲你需要創建和使用你的渲染器的所有信息。順便說一下,你也可以重寫toString()方法,就像@James說的那樣。 – m4tx

+0

@ m4tx _also覆蓋toString()_ - 雖然這是可能的,但它在Swing中是不允許的,創建並顯示來自任意對象的字符串表示是渲染器的專有任務。這裏的一般規則是:永遠不會解決數據領域中的視覺問題。如果您不喜歡默認的toString,請實現使用您所需屬性的自定義渲染器。 – kleopatra

0

不存在用於構造使用ArrayList的JList,但可以使用一個Vector或一個數組(ArrayList可以很容易地轉換爲一個數組)。

要顯示您想要的用戶,您可以使用自定義渲染器。或者,您可以重寫CD的toString()方法,如果我正確記得,它是用於確定顯示內容的默認方法。

+0

對不起,我對Java很陌生。你的意思是我覆蓋CD類中的toString?它是 public String toString(){ \t \t return getTitle(); } – Bernard

+2

@Bernard重寫toString()會解決你的問題,它不是一個可維護的解決方案,不建議依賴這樣的事情,因爲這意味着你將你的UI與你的模型緊密結合。 「最好」的方法是使用渲染器。 –

相關問題