2016-09-06 52 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