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

时间:2018-10-14 01:17:49

标签: listview javafx

在MS Access中,“列表框”可以隐藏2列ResultSet的第一个“列”-非常适合隐藏“ ID”,当用户从列表中选择一个项目时,这些ID易于访问。

如果可能的话,我想在JavaFX中使用ListView进行相同的操作,因此我可以根据第一个ListView的选择填充第二个ListView。

这就是我填充ListView的方式: menuList1.setItems(MenuUtilities.getDivisions()); 来自

public static ObservableList getDivisions() {

    ObservableList divisionListRow = FXCollections.observableArrayList();
    try {
        Connection conn;
        conn = Connect_db.getConnection();
        String query = "SELECT ID, Division FROM tbl_ref_employee_divisions";
        PreparedStatement prestate = conn.prepareStatement(query);
        ResultSet divsResult = prestate.executeQuery();
        while (divsResult.next()) {

            for (int i = 1; i <= divsResult.getMetaData().getColumnCount(); i++) {
                divisionListRow.add(divsResult.getString(i));
            }
        }
        prestate.close();
        divsResult.close();
        conn.close();

    } catch (SQLException ex) {
        ex.printStackTrace();
    }
    return divisionListRow;
}

列表视图显示: see image of List View Output

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

非常感谢

1 个答案:

答案 0 :(得分:1)

您访问ResultSet的方式是为每一行为每一列添加一个元素。您需要为要显示在ListView中的每一行添加一个项目,即,在这种情况下,ResultSet中的每一行要添加一个项目。

由于您希望访问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 */

}
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)));
}

这使您可以像这样访问所选项目的ID:

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

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