在没有中间类的情况下将数据插入JavaFX TableView

我是新手Java程序员。 我想将ResultSet数据插入JavaFX TableView,但我不会使用中间类。 我可以将ResultSet行作为对象插入TableView行吗?

这是我使用中间类Unit的代码

public static ObservableList getUnits() { final ObservableList data = FXCollections.observableArrayList(); if (openConnection()) { try { rs = st.executeQuery("SELECT * FROM units"); while (rs.next()) { data.add(new Unit(rs.getString("id_unit"), rs.getString("short_name"), rs.getString("name"))); } } catch (Exception ex) { Logger.getLogger(SQLConnect.class.getName()).log(Level.SEVERE, null, ex); } } closeConnection(); return data; } 

调节器

 idUnit.setCellValueFactory(new PropertyValueFactory("idUnit")); shortNameUnit.setCellValueFactory(new PropertyValueFactory("shortName")); nameUnit.setCellValueFactory(new PropertyValueFactory("name")); unitsTableView.setItems(SQLConnect.getUnits()); 

你需要一些东西来保存数据; 某些东西(你称之为“中间类”)将成为TableView的数据类型。

它不一定必须是你创建的类,但如果你只是使用一般的东西,你的代码将更难理解。 例如,您可以使用List来保存每一行:

 TableView> unitsTableView = new TableView<>(); idUnit = new TableColumn, String>("Id"); idUnit.setCellValueFactory(new Callback, String>, ObservableValue>() { @Override public ObservableValue call(CellDataFeatures, String>> data) { return new ReadOnlyStringWrapper(data.getValue().get(0)) ; } }); shortNameUnit = new TableColumn, String>("Short Name"); shortNameUnit.setCellValueFactory(new Callback, String>, ObservableValue>() { @Override public ObservableValue call(CellDataFeatures, String>> data) { return new ReadOnlyStringWrapper(data.getValue().get(1)) ; } }); nameUnit = new TableColumn, String>("Name"); nameUnit.setCellValueFactory(new Callback, String>, ObservableValue>() { @Override public ObservableValue call(CellDataFeatures, String>> data) { return new ReadOnlyStringWrapper(data.getValue().get(2)) ; } }); 

接着

 public static ObservableList> getUnits() { final ObservableList> data = FXCollections.observableArrayList(); if (openConnection()) { try { rs = st.executeQuery("SELECT * FROM units"); while (rs.next()) { List unit = new ArrayList<>(); unit.add(rs.getString("id_unit")); unit.add(rs.getString("short_name")); unit.add(rs.getString("name")); data.add(unit); } } catch (Exception ex) { Logger.getLogger(SQLConnect.class.getName()).log(Level.SEVERE, null, ex); } } closeConnection(); return data; } 

但是现在你的代码几乎完全没有你所代表的数据的语义。

请注意,由于多种原因,您无法直接使用ResultSet 。 一个是TableView中的数据由随机访问列表表示。 虽然您可以将ResultSet视为表示数​​据行列表,但它不实现List接口,并且没有任何随机访问function(没有保证获得第5行的方法等)。 另一个原因是ResultSet需要(或至少可能需要,具体取决于JDBC驱动程序实现)实时数据库资源。 因此,您可能会在TableView在范围内的整个时间内锁定数据库表。

为什么要避免创建数据表示类?

解决方法可能是创建扩展TableView的自定义组件,然后在您自己的CustomTableView类中执行魔术