我正在使用包含带有地址的房屋对象的 JList。房屋位于 Neighborhood 类的 TreeMap 中(不确定这是否是最佳选择)。我使用 Map.Entry 和 .entryset() 将 House 值添加到 DefaultListModel,然后将其添加到我的 JList。当单击列表中的 House 对象时,我希望弹出一个 JDialog,其中包含所有房屋属性,例如地址、楼层数等。我的问题是当我使用 ListSelectionListener 中的 getSelectedValue() 时,它只会返回.toString() 形式的字符串或通用对象类型。在我的 JDialog 中,如何在自己的文本字段中获取每个 House 属性?我似乎不能只做 house.getAddress() 因为它不允许我将它作为 House 对象传递。我尝试将 list.SelectedValue() 转换为 House,但最终收到错误“class java.util.TreeMap$Entry 无法转换为 House 类”。当我从地图打印属性时,访问属性没有问题,但一旦它们位于 JList 中,我就会遇到问题。
如果这看起来是一个愚蠢的问题或者有些事情没有意义,我很抱歉。总的来说,我对 Java 和编程还很陌生!
DefaultListModel model = new DefaultListModel();
for (Map.Entry<String, House> value : neighborhood.houses.entrySet()) {
System.out.println(value);
//System.out.println(value.getValue().getAddress()); //< This seems to work
model.addElement(value);
}
JList list = new JList(model);
list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
System.out.println(list.getSelectedValue());
House selectedObj = (House)list.getSelectedValue();
HouseDialog houseDialog = new HouseDialog (selectedObj);
}
}
});
结果是“java.util.TreeMap$Entry 类无法转换为 House 类”
您正在将
Map.Entry
添加到您的 ListModel
...
for (Map.Entry<String, House> value : neighborhood.houses.entrySet()) {
System.out.println(value);
model.addElement(value);
}
也许你本来打算做
model.addElement(value.getValue());
?
您(还)应该做的是利用
DefaultListModel
和 JList
的通用支持。这将为您提供编译时保护,这意味着您只能将 House
的实例添加到模型中,并且在检索它时不需要转换该值,例如...
DefaultListModel<House> model = new DefaultListModel<>();
for (Map.Entry<String, House> value : neighborhood.houses.entrySet()) {
System.out.println(value);
model.addElement(value.getValue());
}
JList<House> list = new JList<>(model);
list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
System.out.println(list.getSelectedValue());
House selectedObj = list.getSelectedValue();
HouseDialog houseDialog = new HouseDialog(selectedObj);
}
}
});