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

我是Java新手。我想将ResultSet数据插入JavaFX

TableView,但我不会使用中间类。我可以将ResultSet行插入到TableView行中作为对象吗?

这是我使用中间类单元的代码

 public static ObservableList<Unit> getUnits() {

final ObservableList<Unit> 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<Unit, String>("idUnit"));

shortNameUnit.setCellValueFactory(new PropertyValueFactory<Unit, String>("shortName"));

nameUnit.setCellValueFactory(new PropertyValueFactory<Unit, String>("name"));

unitsTableView.setItems(SQLConnect.getUnits());

回答:

您需要一些东西来保存数据。某些东西(您称为“中间类”)将成为您的的数据类型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处于作用域的整个时间内锁定数据库表。

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

以上是 在没有中间类的情况下将数据插入JavaFX TableView 的全部内容, 来源链接: utcz.com/qa/397557.html

回到顶部