本文介紹了為了使用TableView,是否需要為每個數據庫查詢創建類?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
在過去的幾天里,我學習了一些關于JavaFX的教程,解釋如何使用TableView?每個教程都為example創建了類似Person
的DataModel對象。只要您只需要像select Firstname, Lastname from Person
這樣的SQL語句就可以了。
但是,如果您不想為每個SELECT查詢創建數據模型,因為您出于某種原因將數據與其他對象聯接起來,該怎么辦呢?例如,select * from Person join City join Country
。前幾天我學到的是,如果創建一個只包含List
(表示行)的表視圖,處理格式甚至計算表視圖都會變得很糟糕。
這真的是JavaFX的事情嗎?還是我錯過了什么?
更新
為了更清楚,請參閱question。我是在閱讀對我的問題的回答和評論后首次發現此問題的,但我對鏈接問題的答案不滿意。
SQL
您的問題在這里混淆了兩個概念:一方面是javafx.scene.control.TableView
,另一方面是推薦答案/ORM。讓我們忘掉SQL查詢,比如我認為您最關心的是TableView
。
TableView
必須填充List
。此列表的內部類型必須與TableView的泛型類型匹配。因此,例如TableView<Person>
將使用List<Person>
填充。
除此之外,表示行的對象的實際類型可以是任何類型。它甚至不必包含數據本身,或者它可以是一個Map<String, Object>
。在本例中,您將通過為每一列定義一個CellValueFactory
來將該行的鍵映射到每一列,該CellValueFactory
將返回您選擇的鍵的入口值。
然后,您可以通過為列定義CellFactory
將此值轉換為String
和/或Node
。
具有JavaFX屬性的對象可以更容易地映射,因為存在僅需要屬性名稱的預制PropertyValueFactory
。但它們并不是唯一的出路。
為每行使用Map<String, Object>
的示例:
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javafx.application.Application;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class App extends Application {
private TableView<Map<String, Object>> tableView;
private TableColumn<Map<String, Object>, String> nameCol;
private TableColumn<Map<String, Object>, Integer> ageCol;
private Stage stage;
@Override
public void start(Stage stage) {
this.stage = stage;
//Insert a TableView into scene
this.tableView = new TableView<>();
this.nameCol = new TableColumn<>("Name");
this.nameCol.setPrefWidth(250);
ageCol = new TableColumn<>("Age");
tableView.getColumns().add(nameCol);
tableView.getColumns().add(ageCol);
nameCol.setCellValueFactory(param -> {
Map<String, Object> v = param.getValue();
return new SimpleStringProperty(v == null ? null : (String) v.get("name"));
});
ageCol.setCellValueFactory(param -> {
Map<String, Object> v = param.getValue();
return new SimpleObjectProperty<Integer>(v == null ? null : (Integer) v.get("age"));
});
ageCol.setCellFactory(param -> {
return new TableCell<>() {
@Override
public void updateItem(Integer item, boolean empty) {
if (empty || item == null)
super.setText("");
else
super.setText(NumberFormat.getIntegerInstance().format(item));
//Could also call setGraphic(Node)
}
};
});
final Scene scene = new Scene(new BorderPane(tableView), 640, 480);
stage.setScene(scene);
stage.setOnShown(event -> stageReady()); //Continue when stage is rendered
stage.show();
}
private void stageReady() {
//Generate data
List<Map<String, Object>> data = new ArrayList<>();
Map<String, Object> obj1 = new HashMap<>();
obj1.put("name", "Name of Object 1");
obj1.put("age", 42);
data.add(obj1);
Map<String, Object> obj2 = new HashMap<>();
obj2.put("name", "OBJECT 2");
obj2.put("age", 53);
data.add(obj2);
//Show data
tableView.getItems().setAll(data);
}
public static void main(String[] args) {
launch();
}
}
ageCol.setCellFactory
僅用于演示。如果我沒有設置它,則Integer
單元格將呈現為調用Integer.toString()
單元格text
屬性。
這篇關于為了使用TableView,是否需要為每個數據庫查詢創建類?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,