当前位置:   article > 正文

[JAVAFX学习]TableView高级操作_javafx tableview checkbox

javafx tableview checkbox

表格编辑和渲染器

默认情况下单元格不可编辑,开启步骤如下:

首先,调用方法设置表格为可编辑的:

tableView.setEditable(true);

其次,设置可编辑列的单元格渲染器,JavaFX有4个内置的单元渲染器:

TextFieldTableCell用于启用使用TextField编辑单元格值。

CheckBoxTableCell用于启用使用CheckBox编辑单元格值。

ChoiceBoxTableCell用于启用使用ChoiceBox编辑单元格值。

ComboBoxTableCell用于启用使用ComboBox编辑单元格值。

使用方法示例:

column1.setCellFactory(TextFieldTableCell.forTableColumn());

失去焦点自动提交

内置TextFieldTableCell在编辑后必须回车才能提交保存。如果需要理解编辑框焦点自动提交保存,可使用自定义的渲染器,示例如下:

  1. // 设置渲染器
  2. column2.setCellFactory((tableColumn) -> new EditingCell<Person>());
  3. /**
  4. * 失去焦点自动提交
  5. *
  6. * @author Raygo
  7. * @since 2022年3月3日
  8. * @param <T>
  9. */
  10. public class EditingCell<T> extends TableCell<T, String> {
  11. private TextField textField;
  12. public EditingCell() {
  13. }
  14. @Override
  15. public void startEdit() {
  16. if (!isEmpty()) {
  17. super.startEdit();
  18. createTextField();
  19. setText(null);
  20. setGraphic(textField);
  21. textField.selectAll();
  22. }
  23. }
  24. @Override
  25. public void cancelEdit() {
  26. super.cancelEdit();
  27. setText((String) getItem());
  28. setGraphic(null);
  29. }
  30. @Override
  31. public void updateItem(String item, boolean empty) {
  32. super.updateItem(item, empty);
  33. if (empty) {
  34. setText(null);
  35. setGraphic(null);
  36. } else {
  37. if (isEditing()) {
  38. if (textField != null) {
  39. textField.setText(getString());
  40. }
  41. setText(null);
  42. setGraphic(textField);
  43. } else {
  44. setText(getString());
  45. setGraphic(null);
  46. }
  47. }
  48. }
  49. @Override
  50. public void commitEdit(String newValue) {
  51. if (!isEditing() && !newValue.equals(this.getItem())) {
  52. TableView<T> table = this.getTableView();
  53. if (this.getTableView() != null) {
  54. TableColumn<T, String> col = this.getTableColumn();
  55. CellEditEvent<T, String> event = new CellEditEvent<T, String>(table,
  56. new TablePosition<T, String>(table, this.getIndex(), col), TableColumn.editCommitEvent(),
  57. newValue);
  58. Event.fireEvent(col, event);
  59. }
  60. }
  61. super.commitEdit(newValue);
  62. updateItem(newValue, false);
  63. }
  64. private void createTextField() {
  65. textField = new TextField(getString());
  66. textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
  67. textField.focusedProperty().addListener((ob, old, now) -> {
  68. if (!now) {
  69. commitEdit(textField.getText());
  70. }
  71. });
  72. }
  73. private String getString() {
  74. return getItem() == null ? "" : getItem().toString();
  75. }
  76. }

嵌套列

 TableView支持列的嵌套,例如:一个名为“地址”的表列可以细分为两个子列:“国家”和“城市”,效果如下图:

 代码示例:

  1. // 嵌套列
  2. TableColumn<Person, String> address = new TableColumn<>("地址");
  3. TableColumn<Person, String> country = new TableColumn<>("国家");
  4. TableColumn<Person, String> city = new TableColumn<>("城市");
  5. // 把子列添加到父列
  6. address.getColumns().addAll(country, city);
  7. // 设置子列的渲染器,父列不需要设置
  8. country.setCellValueFactory(new PropertyValueFactory<>("country"));
  9. city.setCellValueFactory(new PropertyValueFactory<>("city"));
  10. // 添加列到表格视图
  11. tableView.getColumns().add(address);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/191661
推荐阅读
相关标签
  

闽ICP备14008679号