在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。
非常感谢
答案 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");
}
顺便说一句:我建议您指定类型参数,除非您确实有充分的理由使用原始类型。如果使用原始类型,则编译器可以进行一些检查,这些检查可能导致难以发现的问题。