JavaFX中基于TableRow中对象属性的自定义单元格操作

JavaFX中基于TableRow中对象属性的自定义单元格操作,java,javafx,tableview,Java,Javafx,Tableview,大家好 我有一个javaFx表格视图,如下所示: ----------------------------------------- | Name | Date | actions | ----------------------------------------- | jack |23-06-2016 | B1 B2 B3 | ----------------------------------------- | Jane |1

大家好

我有一个javaFx表格视图,如下所示:

----------------------------------------- | Name | Date | actions | ----------------------------------------- | jack |23-06-2016 | B1 B2 B3 | ----------------------------------------- | Jane |12-02-2017 | B1 B2 B3 | ----------------------------------------- | Mickel |22-05-2017 | B1 B2 B3 | ----------------------------------------- ----------------------------------------- |名称|日期|行动| ----------------------------------------- |杰克| 23-06-2016 | B1 B2 B3| ----------------------------------------- |Jane | 12-02-2017 | B1 B2 B3| ----------------------------------------- |米克尔| 22-05-2017 | B1 B2 B3| ----------------------------------------- actions列使用CustomCellTable呈现。它包含三个按钮(B1、B2和B3)

我希望B3按钮仅在对应日期为表中最大值时启用

在上面的示例中,应启用最后一行的B3按钮,其他按钮不应启用


提前感谢您的帮助。

假设您有一个类似

public class Person {

    // ...

    public StringProperty nameProperty() {
        return name ;
    }

    public ObjetProperty<LocalDate> dateProperty() {
        return date ;
    }

    public LocalDate getDate() {
        return dateProperty().get();
    }

    // ...
}
公共类人物{
// ...
公共字符串属性nameProperty(){
返回名称;
}
公共对象属性dateProperty(){
返回日期;
}
公共LocalDate getDate(){
return dateProperty().get();
}
// ...
}
如果您使用以下命令为表创建项目列表:

observeListTableData=FXCollections.observearraylist(p->newobserveable[]{p.dateProperty()});
tableData.addAll(…);
表.设置项(表数据);
那你就可以了

ObjectBinding<Person> personWithLatestDate = Bindings.createObjectBinding(() -> 
        tableData.stream().max(Comparator.comparing(Person::getDate)).orElse(null), 
        tableData);
ObjectBinding personWithLatestDate=Bindings.createObjectBinding(()->
tableData.stream().max(Comparator.comparing(Person::getDate)).orElse(null),
表格数据);
您的“操作”列可以如下所示:

TableColumn<Person, Person> actionsColumn = new TableColumn<>("Actions");
actionsColumn.setCellValueFactory(cellData -> new SimpleObjectProperty<>(cellData.getValue()));

actionsColumn.setCellFactory(tc -> new TableCell<Person, Person>() {
    // ...
    Button b3 = new Button(...) ;
    HBox buttons = new HBox(5, b1, b2, b3);
    // ...

    {
         b3.disableProperty().bind(itemProperty().isNotEqualTo(personWithLatestDate));
    }

    @Override
    protected void updateItem(Person person, boolean empty) {
        super.updateItem(person, empty);
        setGraphic(empty ? null : buttons);
    }
});
TableColumn操作column=新的TableColumn(“操作”);
actionsColumn.setCellValueFactory(cellData->new SimpleObject属性(cellData.getValue());
actionsColumn.setCellFactory(tc->new TableCell(){
// ...
按钮b3=新按钮(…);
HBox按钮=新的HBox(5、b1、b2、b3);
// ...
{
b3.disableProperty().bind(itemProperty().isNotEqualTo(personWithLatestDate));
}
@凌驾
受保护的void updateItem(Person,布尔值为空){
super.updateItem(person,空);
设置图形(空?空:按钮);
}
});
这里有一个SSCCE:

import java.time.LocalDate;
import java.util.Comparator;

import javafx.application.Application;
import javafx.beans.Observable;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.ObjectBinding;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.Window;

public class TableCelDisableButton extends Application {

    private ObservableList<Person> tableData;

    @Override
    public void start(Stage primaryStage) {

        TableView<Person> table = new TableView<>();
        tableData = FXCollections.observableArrayList(p -> new Observable[] {p.dateProperty()});
        table.setItems(tableData);

        ObjectBinding<Person> personWithLatestDate = Bindings.createObjectBinding(() -> 
                tableData.stream().max(Comparator.comparing(Person::getDate)).orElse(null), 
                tableData);

        TableColumn<Person, String> nameCol = new TableColumn<>("Name");
        nameCol.setCellValueFactory(cellData -> cellData.getValue().nameProperty());

        TableColumn<Person, LocalDate> dateCol = new TableColumn<>("Date");
        dateCol.setCellValueFactory(cellData -> cellData.getValue().dateProperty());

        TableColumn<Person, Person> actionsCol = new TableColumn<>("Actions");
        actionsCol.setCellValueFactory(cellData -> new SimpleObjectProperty<>(cellData.getValue()));

        actionsCol.setCellFactory(tc -> new TableCell<Person, Person>() {
            Button edit = new Button("Edit");
            Button button = new Button("Click");
            HBox buttons = new HBox(5, edit, button);

            {
                edit.setOnAction(e -> edit(getItem(), primaryStage, false));
                button.disableProperty().bind(itemProperty().isNotEqualTo(personWithLatestDate));
            }

            @Override
            protected void updateItem(Person person, boolean empty) {
                super.updateItem(person, empty);
                setGraphic(empty ? null : buttons);
            }
        });

        table.getColumns().add(nameCol);
        table.getColumns().add(dateCol);
        table.getColumns().add(actionsCol);

        table.getItems().add(new Person("Jack", LocalDate.of(2016, 6, 23)));
        table.getItems().add(new Person("Jane", LocalDate.of(2017, 2, 12)));
        table.getItems().add(new Person("Mikel", LocalDate.of(2017, 5, 22)));

        Button add = new Button("Add");
        add.setOnAction(e -> edit(new Person("", LocalDate.now()), primaryStage, true));

        Button delete = new Button("Delete");
        delete.disableProperty().bind(table.getSelectionModel().selectedItemProperty().isNull());
        delete.setOnAction(e -> tableData.remove(table.getSelectionModel().getSelectedIndex()));

        HBox buttons = new HBox(5, add, delete);
        buttons.setPadding(new Insets(5));
        buttons.setAlignment(Pos.CENTER);


        Scene scene = new Scene(new BorderPane(table, null, null, buttons, null), 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void edit(Person person, Window primaryStage, boolean addOnCommit) {
        GridPane editor = new GridPane();
        ColumnConstraints leftCol = new ColumnConstraints();
        leftCol.setHgrow(Priority.NEVER);
        leftCol.setHalignment(HPos.RIGHT);
        ColumnConstraints rightCol = new ColumnConstraints();
        rightCol.setHgrow(Priority.SOMETIMES);
        rightCol.setHalignment(HPos.LEFT);
        editor.getColumnConstraints().addAll(leftCol, rightCol);

        editor.setHgap(5);
        editor.setVgap(8);
        editor.setPadding(new Insets(10));

        editor.add(new Label("Name:"), 0, 0);
        editor.add(new Label("Date"), 0, 1);
        TextField name = new TextField(person.getName());
        editor.add(name, 1, 0);
        DatePicker date = new DatePicker(person.getDate());
        editor.add(date, 1, 1);

        Button ok = new Button("OK");
        Button cancel = new Button("Cancel");
        HBox buttons = new HBox(5, ok, cancel);
        buttons.setAlignment(Pos.CENTER);
        editor.add(buttons, 0, 2, 2, 1);


        Scene scene = new Scene(editor);
        Stage editDialog = new Stage();
        editDialog.setScene(scene);
        editDialog.initModality(Modality.APPLICATION_MODAL);
        editDialog.initOwner(primaryStage);
        editDialog.initStyle(StageStyle.UNDECORATED);

        editDialog.sizeToScene();

        ok.setOnAction(e -> {
            person.setName(name.getText());
            person.setDate(date.getValue());
            if (addOnCommit) {
                tableData.add(person);
            }
            editDialog.hide();
        });

        cancel.setOnAction(e -> editDialog.hide());

        editDialog.show();
    }

    public static class Person {
        private final StringProperty name = new SimpleStringProperty();
        private final ObjectProperty<LocalDate> date = new SimpleObjectProperty<>();

        public Person(String name, LocalDate date) {
            setName(name);
            setDate(date);
        }

        public final StringProperty nameProperty() {
            return this.name;
        }


        public final java.lang.String getName() {
            return this.nameProperty().get();
        }


        public final void setName(final java.lang.String name) {
            this.nameProperty().set(name);
        }


        public final ObjectProperty<LocalDate> dateProperty() {
            return this.date;
        }


        public final java.time.LocalDate getDate() {
            return this.dateProperty().get();
        }


        public final void setDate(final java.time.LocalDate date) {
            this.dateProperty().set(date);
        }



    }

    public static void main(String[] args) {
        launch(args);
    }
}
import java.time.LocalDate;
导入java.util.Comparator;
导入javafx.application.application;
导入javafx.beans.Observable;
导入javafx.beans.binding.Bindings;
导入javafx.beans.binding.ObjectBinding;
导入javafx.beans.property.ObjectProperty;
导入javafx.beans.property.SimpleObject属性;
导入javafx.beans.property.SimpleStringProperty;
导入javafx.beans.property.StringProperty;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.geometry.HPos;
导入javafx.geometry.Insets;
导入javafx.geometry.Pos;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.DatePicker;
导入javafx.scene.control.Label;
导入javafx.scene.control.TableCell;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TableView;
导入javafx.scene.control.TextField;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.ColumnConstraints;
导入javafx.scene.layout.GridPane;
导入javafx.scene.layout.HBox;
导入javafx.scene.layout.Priority;
导入javafx.stage.model;
导入javafx.stage.stage;
导入javafx.stage.StageStyle;
导入javafx.stage.Window;
公共类TableDisableButton扩展应用程序{
私有可观测表数据;
@凌驾
公共无效开始(阶段primaryStage){
TableView table=新TableView();
tableData=FXCollections.observableArrayList(p->new Observable[]{p.dateProperty()});
表.设置项(表数据);
ObjectBinding personWithLatestDate=Bindings.createObjectBinding(()->
tableData.stream().max(Comparator.comparing(Person::getDate)).orElse(null),
表格数据);
TableColumn Name col=新的TableColumn(“名称”);
nameCol.setCellValueFactory(cellData->cellData.getValue().nameProperty());
TableColumn dateCol=新的TableColumn(“日期”);
dateCol.setCellValueFactory(cellData->cellData.getValue().dateProperty());
TableColumn actionsCol=新的TableColumn(“操作”);
actionsCol.setCellValueFactory(cellData->new SimpleObject属性(cellData.getValue());
actionsCol.setCellFactory(tc->new TableCell(){
按钮编辑=新按钮(“编辑”);
按钮按钮=新按钮(“单击”);
HBox按钮=新HBox(5,编辑,按钮);
{
setOnAction(e->edit(getItem(),primaryStage,false));
button.disableProperty().bind(itemProperty().isNotEqualTo(personWithLatestDate));
}
@凌驾
受保护的void updateItem(Person,布尔值为空){
super.updateItem(person,空);
设置图形(空?空:按钮);
}
});
table.getColumns().add(nameCol);
table.getColumns().add(dateCol);
table.getColumns().add(actionsCol);
table.getItems().add(新人物(“杰克”,LocalDate.of(2016,6,23));
table.getItems().add(新人物(“Jane”,LocalDate.of(2017,2,12));
table.getItems().add(新人员(“Mikel”,LocalDate.of(2017年5月22日));
按钮添加=新按钮(“添加”);
add.setOnAction(e->edit(newperson(“,LocalDate.now()),primaryStage,true));
按钮删除=新按钮(“删除”);
delete.disableProperty().bind(table.getSelectionModel().SelectEditeProperty().isNull());
delete.setOnAction(e->tableData.remove(table.getSelectionModel().getSelectedIndex());
HBox按钮=新HBox(5,添加,删除);
按钮。设置填充(新插图(5));
按钮。设置对齐(位置中心);
场景场景=新场景(新边框窗格(表,空,空
import java.time.LocalDate;
import java.util.Comparator;

import javafx.application.Application;
import javafx.beans.Observable;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.ObjectBinding;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.Window;

public class TableCelDisableButton extends Application {

    private ObservableList<Person> tableData;

    @Override
    public void start(Stage primaryStage) {

        TableView<Person> table = new TableView<>();
        tableData = FXCollections.observableArrayList(p -> new Observable[] {p.dateProperty()});
        table.setItems(tableData);

        ObjectBinding<Person> personWithLatestDate = Bindings.createObjectBinding(() -> 
                tableData.stream().max(Comparator.comparing(Person::getDate)).orElse(null), 
                tableData);

        TableColumn<Person, String> nameCol = new TableColumn<>("Name");
        nameCol.setCellValueFactory(cellData -> cellData.getValue().nameProperty());

        TableColumn<Person, LocalDate> dateCol = new TableColumn<>("Date");
        dateCol.setCellValueFactory(cellData -> cellData.getValue().dateProperty());

        TableColumn<Person, Person> actionsCol = new TableColumn<>("Actions");
        actionsCol.setCellValueFactory(cellData -> new SimpleObjectProperty<>(cellData.getValue()));

        actionsCol.setCellFactory(tc -> new TableCell<Person, Person>() {
            Button edit = new Button("Edit");
            Button button = new Button("Click");
            HBox buttons = new HBox(5, edit, button);

            {
                edit.setOnAction(e -> edit(getItem(), primaryStage, false));
                button.disableProperty().bind(itemProperty().isNotEqualTo(personWithLatestDate));
            }

            @Override
            protected void updateItem(Person person, boolean empty) {
                super.updateItem(person, empty);
                setGraphic(empty ? null : buttons);
            }
        });

        table.getColumns().add(nameCol);
        table.getColumns().add(dateCol);
        table.getColumns().add(actionsCol);

        table.getItems().add(new Person("Jack", LocalDate.of(2016, 6, 23)));
        table.getItems().add(new Person("Jane", LocalDate.of(2017, 2, 12)));
        table.getItems().add(new Person("Mikel", LocalDate.of(2017, 5, 22)));

        Button add = new Button("Add");
        add.setOnAction(e -> edit(new Person("", LocalDate.now()), primaryStage, true));

        Button delete = new Button("Delete");
        delete.disableProperty().bind(table.getSelectionModel().selectedItemProperty().isNull());
        delete.setOnAction(e -> tableData.remove(table.getSelectionModel().getSelectedIndex()));

        HBox buttons = new HBox(5, add, delete);
        buttons.setPadding(new Insets(5));
        buttons.setAlignment(Pos.CENTER);


        Scene scene = new Scene(new BorderPane(table, null, null, buttons, null), 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void edit(Person person, Window primaryStage, boolean addOnCommit) {
        GridPane editor = new GridPane();
        ColumnConstraints leftCol = new ColumnConstraints();
        leftCol.setHgrow(Priority.NEVER);
        leftCol.setHalignment(HPos.RIGHT);
        ColumnConstraints rightCol = new ColumnConstraints();
        rightCol.setHgrow(Priority.SOMETIMES);
        rightCol.setHalignment(HPos.LEFT);
        editor.getColumnConstraints().addAll(leftCol, rightCol);

        editor.setHgap(5);
        editor.setVgap(8);
        editor.setPadding(new Insets(10));

        editor.add(new Label("Name:"), 0, 0);
        editor.add(new Label("Date"), 0, 1);
        TextField name = new TextField(person.getName());
        editor.add(name, 1, 0);
        DatePicker date = new DatePicker(person.getDate());
        editor.add(date, 1, 1);

        Button ok = new Button("OK");
        Button cancel = new Button("Cancel");
        HBox buttons = new HBox(5, ok, cancel);
        buttons.setAlignment(Pos.CENTER);
        editor.add(buttons, 0, 2, 2, 1);


        Scene scene = new Scene(editor);
        Stage editDialog = new Stage();
        editDialog.setScene(scene);
        editDialog.initModality(Modality.APPLICATION_MODAL);
        editDialog.initOwner(primaryStage);
        editDialog.initStyle(StageStyle.UNDECORATED);

        editDialog.sizeToScene();

        ok.setOnAction(e -> {
            person.setName(name.getText());
            person.setDate(date.getValue());
            if (addOnCommit) {
                tableData.add(person);
            }
            editDialog.hide();
        });

        cancel.setOnAction(e -> editDialog.hide());

        editDialog.show();
    }

    public static class Person {
        private final StringProperty name = new SimpleStringProperty();
        private final ObjectProperty<LocalDate> date = new SimpleObjectProperty<>();

        public Person(String name, LocalDate date) {
            setName(name);
            setDate(date);
        }

        public final StringProperty nameProperty() {
            return this.name;
        }


        public final java.lang.String getName() {
            return this.nameProperty().get();
        }


        public final void setName(final java.lang.String name) {
            this.nameProperty().set(name);
        }


        public final ObjectProperty<LocalDate> dateProperty() {
            return this.date;
        }


        public final java.time.LocalDate getDate() {
            return this.dateProperty().get();
        }


        public final void setDate(final java.time.LocalDate date) {
            this.dateProperty().set(date);
        }



    }

    public static void main(String[] args) {
        launch(args);
    }
}