JavaFX中基于TableRow中对象属性的自定义单元格操作
大家好 我有一个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按钮,其他按钮不应启用JavaFX中基于TableRow中对象属性的自定义单元格操作,java,javafx,tableview,Java,Javafx,Tableview,大家好 我有一个javaFx表格视图,如下所示: ----------------------------------------- | Name | Date | actions | ----------------------------------------- | jack |23-06-2016 | B1 B2 B3 | ----------------------------------------- | Jane |1
提前感谢您的帮助。假设您有一个类似
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);
}
}