如何让 JList getSelectedValue() 返回类对象?

问题描述 投票:0回答:1

我正在使用包含带有地址的房屋对象的 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 类”

java jlist jdialog
1个回答
0
投票

您正在将

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);
        }
    }
});
© www.soinside.com 2019 - 2024. All rights reserved.