如何使TableView的PairTable模型可编辑?

时间:2019-08-09 03:22:03

标签: java javafx

我正在尝试使用一些源代码在JavaFX中创建数据多样化的TableView。提供的代码实际上在添加到ObservableList时确实加载了我的TableView,但是在以合理的方式编辑数据方面我没有成功。有没有人提供如何向该模型添加编辑支持的示例?

我尝试覆盖startEdit()cancelEdit()commitEdit()无济于事,因为当我使用侦听器提交编辑时,是否在任何方法上都调用了supers在我添加到值TextField的{​​{1}}上,与cell集成的列表似乎没有改变,只有表中的视觉值发生了变化,直到我将其滚动到屏幕外为止或更改我要查看的数据。

TableView

预期结果:实际上编辑import javafx.application.*; import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.value.ObservableValue; import javafx.collections.*; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.image.*; import javafx.scene.layout.*; import javafx.stage.Stage; import javafx.util.Callback; import javafx.util.Pair; public class PairTable extends Application { public static final String NAME_COLUMN_NAME = "Name"; public static final String VALUE_COLUMN_NAME = "Value"; final TableView<Pair<String, Object>> table = new TableView<>(); public static void main(String[] args) throws Exception { launch(args); } public void start(final Stage stage) throws Exception { // model data ObservableList<Pair<String, Object>> data = FXCollections.observableArrayList( pair("Song", "Bach Cello Suite 2"), pair("Image", new Image("http://upload.wikimedia.org/wikipedia/en/9/99/Bach_Seal.jpg")), pair("Rating", 4), pair("Classic", true), pair("Song Data", new byte[]{}) ); table.getItems().setAll(data); table.setPrefHeight(275); // table definition TableColumn<Pair<String, Object>, String> nameColumn = new TableColumn<>(NAME_COLUMN_NAME); nameColumn.setPrefWidth(100); TableColumn<Pair<String, Object>, Object> valueColumn = new TableColumn<>(VALUE_COLUMN_NAME); valueColumn.setSortable(false); valueColumn.setPrefWidth(150); nameColumn.setCellValueFactory(new PairKeyFactory()); valueColumn.setCellValueFactory(new PairValueFactory()); table.getColumns().setAll(nameColumn, valueColumn); valueColumn.setCellFactory(new Callback<TableColumn<Pair<String, Object>, Object>, TableCell<Pair<String, Object>, Object>>() { @Override public TableCell<Pair<String, Object>, Object> call(TableColumn<Pair<String, Object>, Object> column) { return new PairValueCell(); } }); // layout the scene. final StackPane layout = new StackPane(); layout.getChildren().setAll(table); Scene scene = new Scene(layout); stage.setScene(scene); stage.show(); } private Pair<String, Object> pair(String name, Object value) { return new Pair<>(name, value); } } class PairKeyFactory implements Callback<TableColumn.CellDataFeatures<Pair<String, Object>, String>, ObservableValue<String>> { @Override public ObservableValue<String> call(TableColumn.CellDataFeatures<Pair<String, Object>, String> data) { return new ReadOnlyObjectWrapper<>(data.getValue().getKey()); } } class PairValueFactory implements Callback<TableColumn.CellDataFeatures<Pair<String, Object>, Object>, ObservableValue<Object>> { @SuppressWarnings("unchecked") @Override public ObservableValue<Object> call(TableColumn.CellDataFeatures<Pair<String, Object>, Object> data) { Object value = data.getValue().getValue(); return (value instanceof ObservableValue) ? (ObservableValue) value : new ReadOnlyObjectWrapper<>(value); } } class PairValueCell extends TableCell<Pair<String, Object>, Object> { @Override protected void updateItem(Object item, boolean empty) { super.updateItem(item, empty); if (item != null) { if (item instanceof String) { setText((String) item); setGraphic(null); } else if (item instanceof Integer) { setText(Integer.toString((Integer) item)); setGraphic(null); } else if (item instanceof Boolean) { CheckBox checkBox = new CheckBox(); checkBox.setSelected((boolean) item); setGraphic(checkBox); } else if (item instanceof Image) { setText(null); ImageView imageView = new ImageView((Image) item); imageView.setFitWidth(100); imageView.setPreserveRatio(true); imageView.setSmooth(true); setGraphic(imageView); } else { setText("N/A"); setGraphic(null); } } else { setText(null); setGraphic(null); } } } 中的数据,而不仅仅是在GUI中描绘的视觉表示。只需在TableView中调用setText()不会反映commitEdit()上的更改,并且在滚动更改或更改正在查看的内容时会重置。

0 个答案:

没有答案