vel*_*elo 5 java javafx resultset tableview
我是新手Java程序员.我想将ResultSet数据插入JavaFX TableView,但我不会使用中间类.我可以将ResultSet行作为对象插入TableView行吗?
这是我使用中间类Unit的代码
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;
}
Run Code Online (Sandbox Code Playgroud)
调节器
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());
Run Code Online (Sandbox Code Playgroud)
你需要一些东西来保存数据;某些东西(您称之为“中间类”)将成为您的TableView.
它不一定是您创建的类,但如果您只使用通用的东西,您的代码将更难理解。例如,您可以只使用 aList<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)) ;
}
});
Run Code Online (Sandbox Code Playgroud)
进而
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;
}
Run Code Online (Sandbox Code Playgroud)
但现在您的代码几乎完全没有您所表示的数据的语义。
ResultSet请注意,由于多种原因,您不能直接使用 a 。其一是 TableView 中的数据由随机访问列表表示。虽然您可以将其视为ResultSet表示数据行列表,但它没有实现List接口,并且没有任何随机访问功能(没有保证可以获取行号 5 等)。另一个原因是ResultSet需要(或者至少可能需要,具体取决于 JDBC 驱动程序实现)实时数据库资源。因此,您将面临在 TableView 处于范围内的整个时间内锁定数据库表的风险。
为什么要避免创建数据表示类?