1 回答

TA貢獻2011條經(jīng)驗 獲得超2個贊
代碼示例,希望對您有所幫助:
public class Main extends Application {
private TableView table = new TableView();
@Override
public void start(Stage primaryStage) throws Exception{
ObservableList<Data> data = FXCollections.observableArrayList(
new Data("Jacob", "Smith", true),
new Data("Isabella", "Johnson",true),
new Data("Ethan", "Williams", false),
new Data("Emma", "Jones", true),
new Data("Michael", "Brown", true)
);
TableColumn firstDataCol = new TableColumn("Data1");
firstDataCol.setMinWidth(100);
firstDataCol.setCellValueFactory(
new PropertyValueFactory<Data, String>("data1"));
TableColumn secondDataCol = new TableColumn("Data2");
secondDataCol.setMinWidth(100);
secondDataCol.setCellValueFactory(
new PropertyValueFactory<Data, String>("data2"));
/*TableColumn isGreenCol = new TableColumn("IsGreen");
isGreenCol.setMinWidth(200);
isGreenCol.setCellValueFactory(
new PropertyValueFactory<Data, Boolean>("isGreen"));*/
table.setRowFactory(new Callback<TableView<Data>, TableRow<Data>>() {
@Override
public TableRow<Data> call(TableView<Data> tableView) {
final TableRow<Data> row = new TableRow<Data>() {
@Override
protected void updateItem(Data data, boolean empty){
super.updateItem(data, empty);
if (data!=null&&data.isGreen.get()) {
setStyle("-fx-text-background-color: green;");
} else {
setStyle("-fx-text-background-color: red;");
}
}
};
return row;
}
});
table.setItems(data);
table.getColumns().addAll(firstDataCol, secondDataCol);
Parent window = new VBox();
((VBox) window).getChildren().add(new Label("example of small window:"));
primaryStage.setTitle("example");
((VBox) window).getChildren().add(table);
Scene scene=new Scene(window);
primaryStage.setScene(scene);
primaryStage.show();
}
public class Data {
private final SimpleStringProperty data1;
private final SimpleStringProperty data2;
private final SimpleBooleanProperty isGreen;
public Data(String data1, String data2, Boolean isGreen) {
this.data1 = new SimpleStringProperty(data1);
this.data2 = new SimpleStringProperty(data2);
this.isGreen = new SimpleBooleanProperty(isGreen);
}
public String getData1() {
return data1.get();
}
public SimpleStringProperty data1Property() {
return data1;
}
public String getData2() {
return data2.get();
}
public SimpleStringProperty data2Property() {
return data2;
}
public boolean isIsGreen() {
return isGreen.get();
}
public SimpleBooleanProperty isGreenProperty() {
return isGreen;
}
}
public static void main(String[] args) {
launch(args);
}
}
輸出畫面:
Java Doc對其工作原理的解釋:
設(shè)置行工廠:
產(chǎn)生 TableRow 的函數(shù)。系統(tǒng)負責重用TableRows。從此函數(shù)返回一個 TableRow,它可能可用于表示 TableView 中的單行。
請注意,TableRow不是TableCell。TableRow 只是 TableCell 的容器,在大多數(shù)情況下,您更有可能希望創(chuàng)建自定義 TableCell,而不是 TableRow。創(chuàng)建自定義 TableRow 實例的主要用例很可能是引入某種形式的列跨越支持。
您可以通過將適當?shù)暮瘮?shù)分配給 TableColumn 類中的 cellFactory 屬性,為每列創(chuàng)建自定義 TableCell 實例。@return rowFactory 屬性
以及對一行中每個單元格的 updateItem 調(diào)用:
更新項目:
updateItem 方法不應(yīng)由開發(fā)人員調(diào)用,但它是開發(fā)人員重寫以允許他們自定義單元格的視覺效果的最佳方法。澄清一下,開發(fā)人員永遠不應(yīng)該在他們的代碼中調(diào)用這個方法(他們應(yīng)該把它留給 UI 控件,比如 ListView 控件)來調(diào)用這個方法。但是,擁有 updateItem 方法的目的是讓開發(fā)人員在指定自定義單元工廠(同樣,如 ListView 單元工廠)時,可以覆蓋 updateItem 方法以允許完全自定義單元。Cell 的子類正確覆蓋 updateItem 方法非常重要,因為不這樣做會導致諸如空白單元格或其中出現(xiàn)意外內(nèi)容的單元格等問題。
protected void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setText(null);
setGraphic(null);
} else {
setText(item.toString());
}
}
請注意此代碼示例中的兩個重要點: 我們調(diào)用 super.updateItem(T, boolean) 方法。如果不這樣做,則 item 和 empty 屬性設(shè)置不正確,最終可能會出現(xiàn)圖形問題。我們測試空條件,如果為真,我們將文本和圖形屬性設(shè)置為空。如果我們不這樣做,幾乎可以保證最終用戶會意外地看到單元格中的圖形工件。覆蓋:單元格中的 updateItem 參數(shù):數(shù)據(jù) – 單元格的新項目。空 - 此單元格是否代表列表中的數(shù)據(jù)。如果它是空的,那么它不代表任何域數(shù)據(jù),而是一個用于呈現(xiàn)“空”行的單元格。
添加回答
舉報