У меня есть этот код:
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);
, но не получается.
Как я могу сделать ячейки таблицы редактируемыми или иметь возможность копировать значение из ячейки в буфер обмена.
@VGR Готово. Я забыл о классе Foo. Спасибо.
Чтобы TableCell
можно было редактировать, необходимо выполнить 3 условия:
TableView
можно редактироватьTableColumn
можно редактироватьВ вашем случае 3-е условие не выполняется, так как ячейки, созданные по умолчанию cellFactory
, не редактируются. Вам нужно назначить cellFactory
, который позволяет редактировать. Кроме того, обратите внимание, что если cellValueFactory
не возвращает объект, реализующий WritableValue
, вам также необходимо использовать обработчик onEditCommit
для хранения данных в элементе:
colText.setCellFactory(TextFieldTableCell.forTableColumn());
colText.setOnEditCommit(evt -> evt.getRowValue().setText(evt.getNewValue()));
Как я могу сделать это для другого типа контента, кроме String?
@KunLun Есть и другие подклассы TableCell
, которые работают для разных типов значений. Конечно, вы также можете создать свою собственную реализацию. Если вы хотите использовать TextField
для ввода данных, вы можете передать StringConverter
в перегруженная версия метода forTableColumn
.
Пожалуйста, включите код для класса Foo. Вам нужно определить свои свойства в этом классе в соответствии с соглашениями Java bean и JavaFX:
getText()
,setText(int)
и, если возможно,textProperty()
.