JavaFXListView-是否可以隐藏ID“column”,还是应该使用单列TableView?

JavaFXListView-是否可以隐藏ID“column”,还是应该使用单列TableView?,listview,javafx,Listview,Javafx,在MS Access中,“列表框”可以隐藏2列结果集的第一个“列”-它非常适合隐藏“ID”,当用户从列表中选择一个项目时,可以轻松访问这些ID 如果可能的话,我希望在JavaFX中使用ListView执行同样的操作,这样我就可以根据第一个ListView中的选择填充第二个ListView 这是我填充ListView的方式: menuList1.setItemsMinuUtilities.getDivisions; 从 列表视图显示: 从图像中我得到的印象是listView无法格式化数组。 如果

在MS Access中,“列表框”可以隐藏2列结果集的第一个“列”-它非常适合隐藏“ID”,当用户从列表中选择一个项目时,可以轻松访问这些ID

如果可能的话,我希望在JavaFX中使用ListView执行同样的操作,这样我就可以根据第一个ListView中的选择填充第二个ListView

这是我填充ListView的方式: menuList1.setItemsMinuUtilities.getDivisions; 从

列表视图显示:

从图像中我得到的印象是listView无法格式化数组。 如果是这样,我使用单列TableView是否更好? 如果是这样,我如何显示ObservableList中的一个字符串列并访问代码中所选项目的整数ID

非常感谢

您访问结果集的方式是,为每一行的每一列添加一个元素。您需要为要在ListView中显示的每一行添加一个项目,即在本例中,结果集中每一行添加一个项目

因为您希望ID可以访问,所以应该创建一个包含两行的值的自定义类型,或者使用现有类(如Pair)并使用cellFactory来选择要显示的数据

public class EmployeeDivision {
    private final long id; // or maybe String/int as type?
    private final String name;

    public EmployeeDivision (long id, String name) {
        this.id = id;
        this.name = name;
    }

    /* getters */

}
这允许您访问所选项目的id,如下所示:

EmployeeDivision selectedItem = menuList1.getSelectionModel().getSelectedItem();
if (selectedItem != null) {
    System.out.println("id = " + selectedItem.getId());
} else {
    System.out.println("no item selected");
}

顺便说一句:我建议指定类型参数,除非您有很好的理由使用原始类型。这允许编译器进行一些检查,如果使用原始类型,可能会导致难以发现的问题。

。也许我应该将我的ResultSet读入一个2字段类,并将一个字段作为单个字符串类型传递给ObservableList。但它仍然回避了一个问题-使用最佳实践-我如何获得ID?很明显,我是一个noob…我有一个不优雅的解决方案,就是使用列表视图,只填充'Division',没有重复项,只使用所选的Division作为参数返回给数据库以获取id…yuk,但在我学到更多之前,它会一直运行。谢谢fabian,这很难理解。我必须承认,直到现在,细胞工厂似乎令人望而生畏,我一直在避免它。但是有了你的建议,我相信我的研究是值得的。来自微软Access和VBA的学习曲线非常陡峭,但每一次胜利都是甜蜜的。非常非常感谢你和所有在这些地方做出贡献的人。不幸的是,我太新了,不能投票。@RodWenban如果这对你有效,你仍然可以接受答案。我可以问一下,你能进一步解释一下指定类型参数的问题吗?我知道类型是什么,但我不知道您在本文中的意思。@RodWenban而不是observeList在返回类型/声明中使用observeList。这允许编译器检查您是否意外添加了错误的对象类型。使用原始类型ObservableList,可以添加字符串,而无需编译器抱怨。如果以后从列表中检索到这样一个元素,并希望它是EmployeeDivision类型,则强制转换将生成ClassCastException。要找出在哪里添加了错误类型的对象可能并不容易。最好允许编译器进行一些检查,即使声明变长了,我也这样做了。差不多了2件事什么是“类型”呢?另外,为了填充employee divison对象,我使用了一个带有静态void方法的实用程序类。简单地说,这是合理的,还是我应该使用另一种方法。在我看来,保持事物模块化还是更干净?
ListView<EmployeeDivision> menuList1;
menuList1.setCellFactory(lv -> new ListCell<EmployeeDivision>() {
    @Override
    protected void updateItem(EmployeeDivision item, boolean empty) {
        super.updateItem(item, empty);
        setText(empty || item == null ? "" : item.getName());
    }
});
while (divsResult.next()) {
    divisionListRow.add(new EmployeeDivision(divsResult.getLong(1), divsResult.getString(2)));
}
EmployeeDivision selectedItem = menuList1.getSelectionModel().getSelectedItem();
if (selectedItem != null) {
    System.out.println("id = " + selectedItem.getId());
} else {
    System.out.println("no item selected");
}