2016-09-06 93 views
-1

我正在使用Eclipse,使用Java進行編程。問題:ArrayList to JList - 多個對象元素

這是我要顯示我的JList:

1 - Dante 
2 - William 
3 - Jaime 
etc... 

現在,數字對象的ID和名稱,以及,名稱。

ArrayList被命名爲TraitList。

這是我所得到的,當我把那個作爲「模式」在JList中從窗口生成器在Eclipse屬性:

TraitL.setModel(new AbstractListModel() { 
     String [] values = new String[] {"1 - Dante", "2 - William", "3 - Jaime"}; 
     public int getSize() { 
      return values.length; 
     } 
     public Object getElementAt(int index) { 
      return values[index]; 
     } 
    }); 

因此,我改變它:

TraitL.setModel(new AbstractListModel() { 
     String [] values = new String []; 
     for (int jln = 0; jln < TraitList.size(); jln++){ 
      values [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 
     } 
     public int getSize() { 
      return values.length; 
     } 
     public Object getElementAt(int index) { 
      return values[index]; 
     } 
    }); 

它沒有工作。我已經嘗試了幾十個變種。沒有工作。那麼,如何讓這個列表顯示一個對象的多個元素?我不在乎它是否是DefaultListModel或AbstractListModel,或者甚至是ListModel。 在此先感謝。

編輯:什麼我已經嘗試了所有的行錯誤是如下圖: errors

獎金的問題: 如何讓我點擊此列表中的元素的「的actionPerformed」,所以有事點擊後?

+0

如果你真的說出了什麼錯誤,這個問題會更容易回答。無論如何,問題的一個可能的來源(除Guilherme的答案中提到的錯誤之外)是'id'和'Name'是否是TraitList列表中類的公共字段。如果他們不是,那麼你可能需要使用他們的獲得者來檢索他們。如果他們是,你應該閱讀封裝。 –

+0

Guilherme對這個問題的建議添加了錯誤作爲圖像的錯誤。 此外,我還沒有給出Trait類中字段的公共或私有分類,所以我猜它們是公開的。我會讀封裝。很久以前就讀過,不記得清楚。 – Werneck

回答

0
new AbstractListModel() { 
    String [] values = new String []; 
    for (int jln = 0; jln < TraitList.size(); jln++){ 
     values [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 
    } 
    public int getSize() { 
     return values.length; 
    } 
    public Object getElementAt(int index) { 
     return values[index]; 
    } 
} 

這是一個無效的匿名類定義,你有代碼在類體中浮動。

它可以由被固定或者在初始化移動到私人方法:

String [] values = initTraitList(); 
private String[] initTraitList() { 
    String [] values = new String [TraitList.size()]; 
    for (int jln = 0; jln < TraitList.size(); jln++){ 
     values [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 
    } 
    return values; 
} 

,或者通過使用實例初始化塊:

String [] values = new String [TraitList.size()]; 
{ 
    for (int jln = 0; jln < TraitList.size(); jln++){ 
     values [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 
    } 
} 
+0

謝謝Kiskae! 我確實解決了我的問題,但是當我繼續測試它時,出現了其他問題 非常感謝,反正這對我來說是一個小問題!^^ – Werneck

+0

@Werneck如果代碼突然觸發了一系列的警告和錯誤,那麼源代碼通常會在開始的時候出現,這是一個很好的事情,當找出這樣的問題的時候,要記住這一點 – Kiskae

+0

只是無法弄清楚如何爲字符串向量賦值。返回值;行代碼對我有用 – Werneck

0

我覺得行

String [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 

應該

values[jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 

吧?

+0

感謝Guilherme,感謝您的迴應! 我試過了,並且還標記爲大衛華萊士問的錯誤。它在編輯問題的圖像中。 – Werneck

+0

歡迎光臨! (: –

0

應該沒有必要將您的列表複製到局部變量。你可以,如果你願意,但沒有必要。這裏是直接在模型中訪問原始列表的一個例子:

public static void main(String[] args) { 
    List<String> values = Arrays.asList("A", "B", "C"); 
    JList list = new JList(new AbstractListModel() { 
     public int getSize() { 
      return values.size(); 
     } 

     public Object getElementAt(int index) { 
      return index + " - " + values.get(index); 
     } 
    }); 
    list.addListSelectionListener(e -> 
      System.out.println("Clicked " + list.getSelectedValue())); 
    JFrame frame = new JFrame("List Test"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.add(list); 
    frame.pack(); 
    frame.setVisible(true); 
} 

如果你特別想它嵌入在價值指數模型裏的數組,然後:

String[] valueCopy = IntStream.range(0, values.size()) 
    .mapToObj(i -> i + " - " + values.get(i)) 
    .toArray(new String[0]); 
public int getSize() { 
    return valueCopy.length; 
} 

public Object getElementAt(int index) { 
    return valueCopy[index]; 
} 
+0

感謝您的回答,短跑運動員。 我標記Kiskae的答案是最有幫助的,因爲它對我來說更簡單,但它也有很多答案,因爲它給了我單擊列表元素後的一個操作示例 非常感謝! – Werneck

0

它可以不使用模型來實現:

String [] values = new String[] {"1 - Dante", "2 - William", "3 - Jaime"}; 
JList jlist = new JList(values); 
scrollpane = new JScrollPane(jlist); 
scrollpane.setViewportView(jlist); 
+0

「1 - Dante 2 - William 3 - Jaime」 「僅僅是我希望顯示的一個例子。另外我做了這個,看看Window Builder如何創建JList。 另外,創建JList時默認最後兩行。 – Werneck