Программное обновление текста в ячейке TableView - Java

Узнай цену своей работы

Формулировка задачи:

Доброго дня. Есть программа отображающая в TableView информацию. В процессе её работы информация меняется и возникает необходимость обновления текста в ячейках таблицы. Для понимания приведу простой пример:
Листинг программы
  1. import javafx.application.Application;
  2. import javafx.beans.property.SimpleStringProperty;
  3. import javafx.collections.FXCollections;
  4. import javafx.collections.ObservableList;
  5. import javafx.event.ActionEvent;
  6. import javafx.event.EventHandler;
  7. import javafx.geometry.Insets;
  8. import javafx.scene.Group;
  9. import javafx.scene.Scene;
  10. import javafx.scene.control.Button;
  11. import javafx.scene.control.Label;
  12. import javafx.scene.control.TableColumn;
  13. import javafx.scene.control.TableView;
  14. import javafx.scene.control.TextField;
  15. import javafx.scene.control.cell.PropertyValueFactory;
  16. import javafx.scene.layout.HBox;
  17. import javafx.scene.layout.VBox;
  18. import javafx.scene.text.Font;
  19. import javafx.stage.Stage;
  20. public class Test extends Application {
  21. private TableView<Person> table = new TableView<Person>();
  22. private final ObservableList<Person> data =
  23. FXCollections.observableArrayList(
  24. new Person("Jacob"),
  25. new Person("Isabella"),
  26. new Person("Ethan"),
  27. new Person("Emma"),
  28. new Person("Michael"));
  29. final HBox hb = new HBox();
  30. public static void main(String[] args) {
  31. launch(args);
  32. }
  33. @Override
  34. public void start(Stage stage) {
  35. Scene scene = new Scene(new Group());
  36. stage.setTitle("Table View Sample");
  37. stage.setWidth(450);
  38. stage.setHeight(550);
  39. table.setEditable(true);
  40. TableColumn firstNameCol = new TableColumn("First Name");
  41. firstNameCol.setMinWidth(100);
  42. firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));
  43. table.setItems(data);
  44. table.getColumns().add(firstNameCol);
  45. final Button button1 = new Button("Edit1");
  46. button1.setOnAction(new EventHandler<ActionEvent>() {
  47. @Override
  48. public void handle(ActionEvent e) {
  49. System.out.println(data.get(2).getFirstName());
  50. data.get(2).setFirstName("abcdef");
  51. System.out.println(data.get(2).getFirstName());
  52. }
  53. });
  54. final Button button2 = new Button("Edit2");
  55. button2.setOnAction(new EventHandler<ActionEvent>() {
  56. @Override
  57. public void handle(ActionEvent e) {
  58. Person temp = data.get(2);
  59. temp.setFirstName("ghijkl");
  60. data.set(2,temp);
  61. }
  62. });
  63. hb.getChildren().addAll(button1, button2);
  64. hb.setSpacing(3);
  65. final VBox vbox = new VBox();
  66. vbox.setSpacing(5);
  67. vbox.setPadding(new Insets(10, 0, 0, 10));
  68. vbox.getChildren().addAll(table, hb);
  69. ((Group) scene.getRoot()).getChildren().addAll(vbox);
  70. stage.setScene(scene);
  71. stage.show();
  72. }
  73. public static class Person {
  74. private final SimpleStringProperty firstName;
  75. private Person(String fName) {
  76. this.firstName = new SimpleStringProperty(fName);
  77. }
  78. public String getFirstName() {
  79. return firstName.get();
  80. }
  81. public void setFirstName(String fName) {
  82. firstName.set(fName);
  83. }
  84. }
  85. }
Если менять текст в объекте (как по нажатию кнопки button1) то значение поля в объекте меняется (это можно видеть по выводу в консоль "до" и "после") но TableView отображает старое значение (оно и понятно - ObservableList ничего не знает о том, что в полях объекта что-то изменилось). Для себя нашёл пока способ "обновления" информации - как по нажатию кнопки button2. Больше никаких идей в голову не пришло, пока не очень хорошо знаком с java. Подскажите, как сообщить ObservableList или TableView о том, что нужно "перерисовать" ячейку или строку?

Решение задачи: «Программное обновление текста в ячейке TableView»

textual
Листинг программы
  1. import javafx.application.Application;
  2. import javafx.beans.property.SimpleStringProperty;
  3. import javafx.collections.FXCollections;
  4. import javafx.collections.ObservableList;
  5. import javafx.geometry.Insets;
  6. import javafx.scene.Group;
  7. import javafx.scene.Scene;
  8. import javafx.scene.control.Button;
  9. import javafx.scene.control.TableColumn;
  10. import javafx.scene.control.TableView;
  11. import javafx.scene.control.cell.PropertyValueFactory;
  12. import javafx.scene.layout.HBox;
  13. import javafx.scene.layout.VBox;
  14. import javafx.stage.Stage;
  15.  
  16. public class Test extends Application {
  17.  
  18.     final HBox hb = new HBox();
  19.     private final ObservableList<Person> data =
  20.             FXCollections.observableArrayList(
  21.                     new Person("Jacob"),
  22.                     new Person("Isabella"),
  23.                     new Person("Ethan"),
  24.                     new Person("Emma"),
  25.                     new Person("Michael"));
  26.     private TableView<Person> table = new TableView<>();
  27.  
  28.     public static void main(String[] args) {
  29.         launch(args);
  30.     }
  31.  
  32.     @Override
  33.     public void start(Stage stage) {
  34.         Scene scene = new Scene(new Group());
  35.         stage.setTitle("Table View Sample");
  36.         stage.setWidth(450);
  37.         stage.setHeight(550);
  38.  
  39.         Person.setTable(table);
  40.         table.setEditable(true);
  41.  
  42.         TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name");
  43.         firstNameCol.setMinWidth(100);
  44.         firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));
  45.  
  46.         table.setItems(data);
  47.         table.getColumns().add(firstNameCol);
  48.  
  49.  
  50.         final Button button1 = new Button("Edit1");
  51.         button1.setOnAction(e -> {
  52.             System.out.println(data.get(2).getFirstName());
  53.             data.get(2).setFirstName("abcdef");
  54.             System.out.println(data.get(2).getFirstName());
  55.         });
  56.  
  57.         final Button button2 = new Button("Edit2");
  58.         button2.setOnAction(e -> {
  59.             Person temp = data.get(2);
  60.             temp.setFirstName("ghijkl");
  61.             data.set(2, temp);
  62.         });
  63.  
  64.         hb.getChildren().addAll(button1, button2);
  65.         hb.setSpacing(3);
  66.  
  67.         final VBox vbox = new VBox();
  68.         vbox.setSpacing(5);
  69.         vbox.setPadding(new Insets(10, 0, 0, 10));
  70.         vbox.getChildren().addAll(table, hb);
  71.  
  72.         ((Group) scene.getRoot()).getChildren().addAll(vbox);
  73.  
  74.         stage.setScene(scene);
  75.         stage.show();
  76.     }
  77.  
  78.     public static class Person {
  79.         static TableView table;
  80.  
  81.         private final SimpleStringProperty firstName;
  82.  
  83.         private Person(String fName) {
  84.             this.firstName = new SimpleStringProperty(fName);
  85.         }
  86.  
  87.         public String getFirstName() {
  88.             return firstName.get();
  89.         }
  90.  
  91.         public void setFirstName(String fName) {
  92.             firstName.set(fName);
  93.             table.refresh();
  94.         }
  95.  
  96.         static void setTable(TableView<Person> table) {
  97.             Person.table = table;
  98.         }
  99.     }
  100. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут