2017-06-10 7 views
0

MapViewを使ってMapViewを表示しようとしていますが、これまでのところすべて正常に動作しますが、ときに保存され、Enterキーを押して、入力フィールドがフォーカスを失ったときに変更が保存されたことを望みます。JAVA FX:地図データを持つTableVIew、入力がフォーカスを失ったときに値を更新する

私はカスタムレンダリングでこの動作に到達しようとしましたが、期待したとおりに動作しません。

私が必要とするのは、ユーザーがマウスを動かしてフォーカスを失った行を選択解除したときの変更を保存する方法を知ることだけです。

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; 
} 
} 

よろしく

+0

[* TableViewはフォーカスの損失イベント*(https://stackoverflow.com/q/29576577/230513)の値をコミットできません。 – trashgod

答えて

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"); 
    } 



    }); 
関連する問題