JAVA FX:TableVIew with Map Data,输入失去焦点时更新值

时间:2017-06-10 11:26:58

标签: dictionary javafx textfield

我正在尝试使用TableView显示一个Map,到目前为止一切正常,但是当我编辑任何字段的值时,仅在保存更改时按Enter键并且我希望更改在输入字段失去焦点时存储。

我尝试使用自定义渲染来达到此行为,但它无法正常工作。

这是我的代码,我唯一需要知道的是当用户移动鼠标并取消选择行时失去焦点时保存更改的方法。

import java.util.HashMap;
import java.util.Map;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;  
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.MapValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.util.StringConverter;

public class TableViewSample extends Application {

public static final String Column1MapKey = "Key";
public static final String Column2MapKey = "Value";

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

@Override
public void start(Stage stage) {
    Scene scene = new Scene(new Group());
    stage.setTitle("Table View Sample");
    stage.setWidth(300);
    stage.setHeight(500);

    TableColumn<Map, String> firstDataColumn = new TableColumn<>("Key");
    TableColumn<Map, String> secondDataColumn = new TableColumn<>("Value");

    firstDataColumn.setCellValueFactory(new MapValueFactory(Column1MapKey));
    firstDataColumn.setMinWidth(130);
    secondDataColumn.setCellValueFactory(new MapValueFactory(Column2MapKey));
    secondDataColumn.setMinWidth(130);

    TableView table_view = new TableView<>(generateDataInMap());

    table_view.setEditable(true);
    table_view.getSelectionModel().setCellSelectionEnabled(true);
    table_view.getColumns().setAll(firstDataColumn, secondDataColumn);
    Callback<TableColumn<Map, String>, TableCell<Map, String>>
        cellFactoryForMap = new Callback<TableColumn<Map, String>,
            TableCell<Map, String>>() {
                @Override
                public TableCell call(TableColumn p) {
                    return new TextFieldTableCell(new StringConverter() {
                        @Override
                        public String toString(Object t) {
                            return t.toString();
                        }
                        @Override
                        public Object fromString(String string) {
                            return string;
                        }                                    
                    });
                }
    };
    firstDataColumn.setCellFactory(cellFactoryForMap);
    secondDataColumn.setCellFactory(cellFactoryForMap);

    final VBox vbox = new VBox();

    vbox.setSpacing(5);
    vbox.setPadding(new Insets(10, 0, 0, 10));
    vbox.getChildren().addAll(table_view);

    ((Group) scene.getRoot()).getChildren().addAll(vbox);

    stage.setScene(scene);

    stage.show();
}

private ObservableList<Map> generateDataInMap() {
    int max = 10;
    ObservableList<Map> allData = FXCollections.observableArrayList();
    for (int i = 1; i < max; i++) {
        Map<String, String> dataRow = new HashMap<>();

        String key = "Key " + i;
        String value = "Value " + i;

        dataRow.put(Column1MapKey, key);
        dataRow.put(Column2MapKey, value);

        allData.add(dataRow);
    }
    return allData;
}
}

此致

1 个答案:

答案 0 :(得分:0)

您可以在table_view.focusedProperty上添加事件侦听器。

这会听取表格视图的焦点,而不是每个项目的焦点。

table_view.focusedProperty.addListener( new ChangeListener<Boolean>(){
FocusPropertyChangeListener() { System.out.println("New FPCL instance"); }

    @Override
    public void changed(ObservableValue<? extends Boolean> ov, 
        Boolean oldb, Boolean newb) {
        System.out.println("Focus change triggered");
    }



    });