您需要一些东西来保存数据。某些东西(您称为“中间类”)将成为您的的数据类型
TableView。
它不必一定是您创建的类,但是如果您仅使用一般性的东西,那么您的代码将很难理解。例如,您可以只使用a
List<String>来保存每一行:
TableView<List<String>> unitsTableView = new TableView<>();idUnit = new TableColumn<List<String>, String>("Id");idUnit.setCellValueFactory(new Callback<CellDataFeatures<List<String>, String>, Observablevalue<String>>() { @Override public Observablevalue<String> call(CellDataFeatures<List<String>, String>> data) { return new ReadonlyStringWrapper(data.getValue().get(0)) ; }});shortNameUnit = new TableColumn<List<String>, String>("Short Name");shortNameUnit.setCellValueFactory(new Callback<CellDataFeatures<List<String>, String>, Observablevalue<String>>() { @Override public Observablevalue<String> call(CellDataFeatures<List<String>, String>> data) { return new ReadonlyStringWrapper(data.getValue().get(1)) ; }});nameUnit = new TableColumn<List<String>, String>("Name");nameUnit.setCellValueFactory(new Callback<CellDataFeatures<List<String>, String>, Observablevalue<String>>() { @Override public Observablevalue<String> call(CellDataFeatures<List<String>, String>> data) { return new ReadonlyStringWrapper(data.getValue().get(2)) ; }});然后
public static ObservableList<List<String>> getUnits() { final ObservableList<List<String>> data = FXCollections.observableArrayList(); if (openConnection()) { try { rs = st.executeQuery("SELECt * FROM units"); while (rs.next()) { List<String> 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接口,并且没有任何随机访问功能(无法保证获得第5行等)。另一个原因是
ResultSet需要(或至少可能需要,取决于JDBC驱动程序的实现)活动数据库资源。因此,您将有可能在TableView处于作用域的整个时间内锁定数据库表。
为什么要避免创建数据表示形式类?



