我的fxml中有一个TableView作为复杂POJO的容器。
我已经成功定制了显示,为我所说的复杂POJO的每个实例提供了一个漂亮的窗格,但现在我想编辑基础集合。
为此,我可以在我的视图中添加一个Button,其中包含一个动作监听器和yadda yadda。
但这有点不连贯,我更喜欢直接在我的TableView上添加按钮。最好是像标题栏"在右侧。
我使用GridPane做了类似的事情,但并不想完全重构我的代码,所以这里是我想要实现的效果的屏幕保护程序:
最上面一行是表格标题,因此风格稍有不同。我错过了一些非常简单的东西吗?
答案 0 :(得分:1)
此答案基于此gist:
对于标题中的+
按钮,您只需创建一个TableColumn
并将其图形设置为一个按钮。
Button addButton = new Button("+");
TableColumn<Person, Object> buttonColumn = new TableColumn<>();
buttonColumn.setGraphic(addButton);
对于每行中的-
按钮,您需要自定义updateItem
类的TableCell
方法以允许每行中的按钮。为了处理每一行的按钮操作,我们使用CallBack
:
public class ButtonTableCell<S,T> extends TableCell<S,T> {
private Button button;
public ButtonTableCell(final Callback<Integer, Void> pressedCallback) {
this(pressedCallback, null, null);
}
public ButtonTableCell(final Callback<Integer, Void> pressedCallback, String buttonText, Node buttonGraphic) {
this.button = new Button(buttonText, buttonGraphic);
this.button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
pressedCallback.call(getTableRow().getIndex());
}
});
}
@Override
protected void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
if(empty) {
setGraphic(null);
} else {
setGraphic(button);
button.disableProperty().bind(Bindings.not(
getTableView().editableProperty().and(
getTableColumn().editableProperty()).and(
editableProperty())
));
}
}
}
然后使按钮列CellFactory
使用此修改后的TableCell
:
public class TableViewWithButtonColumnDemo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
TableView<Person> tableview = new TableView<>(
FXCollections.observableArrayList(
new Person("Person", "1"),
new Person("Person", "2"),
new Person("Person", "3")));
TableColumn<Person, String> firstNameColumn = new TableColumn<>("First Name");
firstNameColumn.setCellValueFactory(new PropertyValueFactory("firstName"));
TableColumn<Person, String> lastNameColumn = new TableColumn<>("Last Name");
lastNameColumn.setCellValueFactory(new PropertyValueFactory("lastName"));
Button addButton = new Button("+");
addButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
tableview.getItems().add(new Person("person", String.valueOf(tableview.getItems().size()+1)));
}
});
TableColumn<Person, Object> buttonColumn = new TableColumn<>();
buttonColumn.setGraphic(addButton);
buttonColumn.setCellFactory(new Callback<TableColumn<Person,Object>, TableCell<Person,Object>>() {
@Override
public TableCell<Person, Object> call(TableColumn<Person, Object> param) {
Callback<Integer, Void> pressedCallback = new Callback<Integer, Void>() {
@Override
public Void call(Integer index) {
Person buttonPressedPerson = tableview.getItems().get(index);
tableview.getItems().remove(buttonPressedPerson);
return null;
}
};
return new ButtonTableCell<>(pressedCallback, "-", null);
}
});
tableview.setEditable(true);
tableview.getColumns().addAll(firstNameColumn, lastNameColumn, buttonColumn);
primaryStage.setScene(new Scene(tableview));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}