Редактируемый JavaFX TableView (true) не работает

У меня есть этот код:

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

@Override
public void start(Stage primaryStage){

    TableView<Foo> tableView = new TableView<>();
    tableView.setColumnResizePolicy(TableView.UNCONSTRAINED_RESIZE_POLICY);
    tableView.setPlaceholder(new Label("No data"));
    tableView.setEditable(true);

    TableColumn<Foo, String> colText = new TableColumn<>("Text");
    colText.setCellValueFactory(new PropertyValueFactory<>("text"));

    tableView.getColumns().add(colText);

    List<Foo> listFoo = new ArrayList<>(Arrays.asList(new Foo("1"), new Foo("2"), new Foo("3")));

    tableView.setItems(FXCollections.observableArrayList(listFoo));

    primaryStage.setScene(new Scene(tableView));
    primaryStage.show();

}

public class Foo{

    private String text;

    public Foo(String txt){ text = txt; }

    public String getText(){ return text; }

    public void setText(String text){ this.text = text; }

}

Пытаюсь сделать ячейки таблицы редактируемыми: tableView.setEditable(true);, но не получается.

Как я могу сделать ячейки таблицы редактируемыми или иметь возможность копировать значение из ячейки в буфер обмена.

Пожалуйста, включите код для класса Foo. Вам нужно определить свои свойства в этом классе в соответствии с соглашениями Java bean и JavaFX: getText(), setText(int) и, если возможно, textProperty().

VGR 28.05.2019 15:47

@VGR Готово. Я забыл о классе Foo. Спасибо.

KunLun 28.05.2019 16:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы TableCell можно было редактировать, необходимо выполнить 3 условия:

  1. Содержащий TableView можно редактировать
  2. Содержащий TableColumn можно редактировать
  3. Сама ячейка доступна для редактирования

В вашем случае 3-е условие не выполняется, так как ячейки, созданные по умолчанию cellFactory, не редактируются. Вам нужно назначить cellFactory, который позволяет редактировать. Кроме того, обратите внимание, что если cellValueFactory не возвращает объект, реализующий WritableValue, вам также необходимо использовать обработчик onEditCommit для хранения данных в элементе:

colText.setCellFactory(TextFieldTableCell.forTableColumn());
colText.setOnEditCommit(evt -> evt.getRowValue().setText(evt.getNewValue()));

Как я могу сделать это для другого типа контента, кроме String?

KunLun 28.05.2019 17:00

@KunLun Есть и другие подклассы TableCell, которые работают для разных типов значений. Конечно, вы также можете создать свою собственную реализацию. Если вы хотите использовать TextField для ввода данных, вы можете передать StringConverter в перегруженная версия метода forTableColumn.

fabian 28.05.2019 18:07

Другие вопросы по теме