我在JavaFX TableView中刷新行样式有问题。JavaFX:如何刷新表格?
Java版本 “1.8.0_51”
的Java(TM)SE运行时环境(建立1.8.0_51-B16)
的HotSpot的Java(TM)服务器VM(25.51建设-B03,混合模式)
逻辑:
加载数据到的tableView。
通过setRowFactory将新样式设置为行。
将新数据加载到表中。
刷新新表格行的样式。 (不适用于我)
如何重新加载行的样式?
我的代码片段:
import javafx.application.Application;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Callback;
public class RowFactoryAndOptimisationDemo extends Application {
VBox root;
public ObservableList data = FXCollections.observableArrayList();
public TableView tableView = new TableView();
@Override
public void start(Stage stage) throws Exception {
root = new VBox();
root.autosize();
Scene scene = new Scene(root, Color.LINEN);
stage.setTitle("Row Factory Demo");
stage.setWidth(500);
stage.setHeight(300);
stage.setScene(scene);
stage.show();
configureTable();
}
public static void main(String[] args) {
Application.launch(args);
}
private void recheck_table() {
tableView.setRowFactory(new Callback, TableRow>() {
@Override
public TableRow call(TableView paramP) {
return new TableRow() {
@Override
protected void updateItem(RFDDomain paramT, boolean paramBoolean) {
super.updateItem(paramT, paramBoolean);
if (!isEmpty()) {
String style = "-fx-control-inner-background: #007F0E;"
+ "-fx-control-inner-background-alt: #007F0E;";
setStyle(style);
}
}
};
}
});
}
@SuppressWarnings("unchecked")
private void configureTable() {
int id =1;
for (int i = 1; i <= 1; i++) {
data.add(new RFDDomain(id++,"First Row", "This is for check.", 1));
data.add(new RFDDomain(id++,"Second Row", null, 2));
data.add(new RFDDomain(id++,"Third Row", "This is for check.", 3));
data.add(new RFDDomain(id++,"Fourth Row", "dil", 4));
}
tableView.setItems(data);
recheck_table();
TableColumn column0 = new TableColumn("Id");
column0.setCellValueFactory(new PropertyValueFactory("id"));
TableColumn column1 = new TableColumn("Title");
column1.setCellValueFactory(new PropertyValueFactory("name"));
TableColumn column2 = new TableColumn("Description");
column2.setCellValueFactory(new PropertyValueFactory("description"));
TableColumn column3 = new TableColumn("Status");
column3.setPrefWidth(55);
column3.setCellValueFactory(new PropertyValueFactory("status"));
TableColumn column4 = new TableColumn("Action");
column4.setCellValueFactory(new PropertyValueFactory("name"));
tableView.getColumns().addAll(column0, column1, column2, column3, column4);
this.root.getChildren().add(tableView);
Button button1 = new Button("Load new Data");
button1.setOnAction(new EventHandler() {
@Override public void handle(ActionEvent e) {
data.clear();
data.removeAll(data);
data.add(new RFDDomain(1,"First Row", "This is for check.", 1));
data.add(new RFDDomain(2,"Second Row", null, 2));
tableView.setItems(data);
recheck_table();
}
});
this.root.getChildren().add(button1);
}
/**
* Domain Model for this demo.
*/
public class RFDDomain {
private SimpleIntegerProperty id = new SimpleIntegerProperty();
private SimpleStringProperty name = new SimpleStringProperty();
private SimpleStringProperty description = new SimpleStringProperty();
private SimpleIntegerProperty status = new SimpleIntegerProperty();
public RFDDomain(int id,String name, String desc, int status) {
this.id.set(id);
this.name.set(name);
this.description.set(desc);
this.status.set(status);
}
public int getId() {
return id.get();
}
public SimpleIntegerProperty idProperty() {
return id;
}
public String getDescription() {
return description.get();
}
public SimpleStringProperty descriptionProperty() {
return description;
}
public String getName() {
return name.get();
}
public SimpleStringProperty nameProperty() {
return name;
}
public int getStatus() {
return status.get();
}
public SimpleIntegerProperty statusProperty() {
return status;
}
}
}
2015-08-15
stdex
+1
在你的代码中,你将现在空的行设置为纯背景吗? –
+0
button1.setOnAction - 仅设置2行,但3-4行的样式不重新加载。 –
+1
我在您的代码中看到您为包含数据的行设置样式,但我没有看到您设置的行的位置已更改,因此它们不包含纯数据样式的数据。顺便说一句,你为什么要调用recheck_table()这么多?你只需要设置行工厂一次。 –