2014-04-11 45 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類中的魔法

相關問題