JavaFX:如何刷新表?

std*_*dex 7 java javafx

我在JavaFX TableView中刷新行样式有问题.

java版"1.8.0_51"

Java(TM)SE运行时环境(版本1.8.0_51-b16)

Java HotSpot(TM)服务器VM(内置25.51-b03,混合模式)

逻辑:

  1. 将数据加载到tableView.
  2. 通过setRowFactory将新样式设置为行.
  3. 将新数据加载到表中.
  4. 刷新新表行的样式.(不适合我.)

如何为行重新加载样式?

我的代码片段:

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<RFDDomain> data = FXCollections.observableArrayList();
        public TableView<RFDDomain> tableView = new TableView<RFDDomain>();

    @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<TableView<RFDDomain>, TableRow<RFDDomain>>() {
            @Override
            public TableRow<RFDDomain> call(TableView<RFDDomain> paramP) {
                    return new TableRow<RFDDomain>() {

                            @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<RFDDomain, Integer> column0 = new TableColumn<RFDDomain, Integer>("Id");
        column0.setCellValueFactory(new PropertyValueFactory<RFDDomain, Integer>("id"));

        TableColumn<RFDDomain, String> column1 = new TableColumn<RFDDomain, String>("Title");
        column1.setCellValueFactory(new PropertyValueFactory<RFDDomain, String>("name"));

        TableColumn<RFDDomain, String> column2 = new TableColumn<RFDDomain, String>("Description");
        column2.setCellValueFactory(new PropertyValueFactory<RFDDomain, String>("description"));

        TableColumn<RFDDomain, Number> column3 = new TableColumn<RFDDomain, Number>("Status");
        column3.setPrefWidth(55);
        column3.setCellValueFactory(new PropertyValueFactory<RFDDomain, Number>("status"));

        TableColumn<RFDDomain, String> column4 = new TableColumn<RFDDomain, String>("Action");
        column4.setCellValueFactory(new PropertyValueFactory<RFDDomain, String>("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<ActionEvent>() {
                    @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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Rus*_*zov 17

试试tableView.refresh().自Java 8u60以来,它在JavaFX中可用.

  • 不,永远不要使用刷新 - 这是对正常自动更新机制无法处理的极其罕见的情况(如 0.0000099%)的紧急取消!@atlantis 设置有问题 (2认同)