代码之家  ›  专栏  ›  技术社区  ›  Zephyr

如何为TableView创建条件CellValueFactory?

  •  4
  • Zephyr  · 技术社区  · 7 年前

    我有一个 TableView 需要显示数据对象中两个值之一的列。

    Person nickname 可以填充、空或 null .


    个人.java:

    import javafx.beans.property.IntegerProperty;
    import javafx.beans.property.SimpleIntegerProperty;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.property.StringProperty;
    
    public class Person {
    
        private IntegerProperty id = new SimpleIntegerProperty();
        private StringProperty firstName = new SimpleStringProperty();
        private StringProperty lastName = new SimpleStringProperty();
        private StringProperty nickname = new SimpleStringProperty();
    
        public Person(int id, String firstName, String lastName, String nickname) {
            this.id.set(id);
            this.firstName.set(firstName);
            this.lastName.set(lastName);
            this.nickname.set(nickname);
        }
    
        public int getId() {
            return id.get();
        }
    
        public IntegerProperty idProperty() {
            return id;
        }
    
        public void setId(int id) {
            this.id.set(id);
        }
    
        public String getFirstName() {
            return firstName.get();
        }
    
        public StringProperty firstNameProperty() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName.set(firstName);
        }
    
        public String getLastName() {
            return lastName.get();
        }
    
        public StringProperty lastNameProperty() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName.set(lastName);
        }
    
        public String getNickname() {
            return nickname.get();
        }
    
        public StringProperty nicknameProperty() {
            return nickname;
        }
    
        public void setNickname(String nickname) {
            this.nickname.set(nickname);
        }
    }
    

    Main.java文件:

    import javafx.application.Application;
    import javafx.geometry.Insets;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    
    public class Main extends Application {
    
        public static void main(String[] args) {
            launch(args);
        }
    
        @Override
        public void start(Stage primaryStage) {
    
            // Simple Interface
            VBox root = new VBox(10);
            root.setAlignment(Pos.CENTER);
            root.setPadding(new Insets(10));
    
            // Build the simple TableView
            TableView<Person> tableView = new TableView<>();
            TableColumn<Person, String> colId = new TableColumn<>("ID");
            TableColumn<Person, String> colName = new TableColumn<>("Name");
    
            // Set the cell value factories
            colId.setCellValueFactory(new PropertyValueFactory<>("id"));
            colName.setCellValueFactory(new PropertyValueFactory<>("nickname"));
    
            // Add the column to the tableview
            tableView.getColumns().addAll(colId, colName);
    
            // Populate the tableview with a couple of samples
            tableView.getItems().addAll(
                    new Person(1, "John", "Williams", null),
                    new Person(2, "Marty", "McFly", "Chicken"),
                    new Person(3, "Emmett", "Brown", "Doc"),
                    new Person(4, "Hans", "Zimmer", "")
            );
    
            // Add the table to the scene
            root.getChildren().add(tableView);
    
            // Show the stage
            primaryStage.setScene(new Scene(root));
            primaryStage.setTitle("Sample");
            primaryStage.show();
        }
    }
    

    CellValueFactory 这将使用 昵称 属性,但如果 为空或null。

    如何创建条件 CellValue工厂 我假设它需要为工厂创建一个新的回调函数,但我不确定它是如何工作的。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Slaw    7 年前

    hints at ,一种方法是在 cellValueFactory . 这是通过 Bindings.when(ObservableBooleanValue) .

    nameCol.setCellValueFactory(features -> {
      var firstName = features.getValue().firstNameProperty();
      var lastName  = features.getValue().lastNameProperty();
      var nickname  = features.getValue().nicknameProperty();
    
      return Bindings.when(nickname.isEmpty())
          .then(firstName.concat(" ").concat(lastName))
          .otherwise(nickname);
    });
    

    这个 isEmpty() null

    注:如果 StringExpression 无效的 ,则认为为空。