2014-04-11 47 views
4

我是新手Java程序员。 我想插入ResultSet数据到JavaFX TableView,但我不会使用中间类。我可以插入ResultSet行作为对象的TableView行吗?将数据插入到没有中间类的JavaFX 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()); 

回答

3

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

它不一定是你创建的类,但是如果你只是使用一般的东西,你的代码会变得更难理解。例如,你可以只使用一个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在范围内。

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

0

一种解决方法可能是创建一个扩展的TableView您的自定义组件,然后做自己的CustomTableView类中的魔法

相关问题