ArrayList 到 JList - 不止一个对象元素
ArrayList to JList - More than one object element
我正在使用 Eclipse,在 Java 中编程。问题:
这就是我希望我的 JList 的显示方式:
1 - Dante
2 - William
3 - Jaime
etc...
现在,数字是对象的 ID,名称就是名称。
ArrayList 被命名为 TraitList。
这是我在 Eclipse 的 Window Builder 的 JList 中将其作为 "model" 属性 时得到的结果:
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];
}
});
没用。我已经尝试了数十种变体。 None 成功了。那么,如何让这个列表显示一个对象的多个元素呢?我不关心它是 DefaultListModel 还是 AbstractListModel,甚至是 ListModel。
提前致谢。
编辑:我尝试过的所有行的错误如下图所示:
奖金问题:
如何使单击此列表的元素成为 "actionPerformed",以便在我单击它后发生某些事情?
我觉得行
String [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name);
应该是
values[jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name);
对吗?
不需要将您的列表复制到局部变量。如果你愿意,你可以,但这不是必需的。下面是直接在模型中访问原始列表的示例:
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];
}
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];
}
}
这是一个无效的匿名 class 定义,您的代码在 class 正文中浮动。
可以通过将初始化移至私有方法来解决此问题:
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);
}
}
不用模型也能实现:
String [] values = new String[] {"1 - Dante", "2 - William", "3 - Jaime"};
JList jlist = new JList(values);
scrollpane = new JScrollPane(jlist);
scrollpane.setViewportView(jlist);
我正在使用 Eclipse,在 Java 中编程。问题:
这就是我希望我的 JList 的显示方式:
1 - Dante
2 - William
3 - Jaime
etc...
现在,数字是对象的 ID,名称就是名称。
ArrayList 被命名为 TraitList。
这是我在 Eclipse 的 Window Builder 的 JList 中将其作为 "model" 属性 时得到的结果:
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];
}
});
没用。我已经尝试了数十种变体。 None 成功了。那么,如何让这个列表显示一个对象的多个元素呢?我不关心它是 DefaultListModel 还是 AbstractListModel,甚至是 ListModel。 提前致谢。
编辑:我尝试过的所有行的错误如下图所示:
奖金问题: 如何使单击此列表的元素成为 "actionPerformed",以便在我单击它后发生某些事情?
我觉得行
String [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name);
应该是
values[jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name);
对吗?
不需要将您的列表复制到局部变量。如果你愿意,你可以,但这不是必需的。下面是直接在模型中访问原始列表的示例:
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];
}
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];
}
}
这是一个无效的匿名 class 定义,您的代码在 class 正文中浮动。
可以通过将初始化移至私有方法来解决此问题:
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);
}
}
不用模型也能实现:
String [] values = new String[] {"1 - Dante", "2 - William", "3 - Jaime"};
JList jlist = new JList(values);
scrollpane = new JScrollPane(jlist);
scrollpane.setViewportView(jlist);