在没有中间类的情况下将数据插入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类中执行魔术
- 没有类型作为方法参数的通用 – 无法解析它的字段类型
- mergesort中的递归:两个递归调用
- 在Grails应用程序中检索活动区域设置
- Spring MVC JavaConfig webapp中的“error-page”配置? (没有web.xml)
- oracle.jdbc.driver.T4CTTIrxd.readBitVector上的java.lang.ArrayIndexOutOfBoundsException(T4CTTIrxd.java:135)
- 如何设置用于使用HttpsURLConnection创建的套接字的密码和协议列表?
- 为什么我从这个Java代码中获得Null Pointer Exception?
- 使用OR条件而不是AND条件连接列的注释
- 如何将List 的值而不是引用复制到另一个列表中?