Как создать условный CellValueFactory для TableView?

У меня есть TableView со столбцом, который должен отображать одно из двух значений из моего объекта данных.

В MCVE ниже у меня есть объект Person, который может иметь или не иметь nickname свойство. Это nickname может быть либо заполнено, либо пусто, либо null


Person.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, который будет использовать nickname, если оно имеет значение, но полное имя и фамилию человека, если nickname пусто или равно нулю .

Как создать условный CellValueFactory? . Предполагается, что для этого требуется создать новую функцию обратного вызова для фабрика, но я не уверен, как это работает.

4 голоса | спросил Zephyr 5 +03002018-10-05T18:34:25+03:00312018bEurope/MoscowFri, 05 Oct 2018 18:34:25 +0300 2018, 18:34:25

1 ответ


0
Как намекает @kleopatra, один из способов сделать это - создать условное связывание в ---- +: = 0 =: + ---- .Это делается через ---- +: = 1 =: + ---- .Привязка ---- +: = 3 =: + ---- считает значения ---- +: = 4 =: + ---- пустыми.Примечание. Если значение этого ---- +: = 5 =: + ---- равно ---- +: = 6 =: + ---- , оно считается пустым.
ответил Slaw 6 +03002018-10-06T05:39:40+03:00312018bEurope/MoscowSat, 06 Oct 2018 05:39:40 +0300 2018, 05:39:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132