2017-06-10 1 views
0

J'essaie d'afficher une carte avec un TableView, jusqu'ici tout fonctionne bien, mais quand je modifie la valeur d'un champ, le changement seulement est enregistré quand et appuyez sur la touche ENTRÉE et je voudrais que le changement a été stocké lorsque le champ d'entrée perd le focus.JAVA FX: TableVIew avec données cartographiques, valeur de mise à jour lorsque l'entrée a perdu le focus

J'ai essayé d'atteindre ce comportement avec un rendu personnalisé mais cela ne fonctionne pas que je m'attendais.

Ceci est mon code, et la seule chose dont j'ai besoin est de savoir comment enregistrer les changements lorsque l'utilisateur déplace la souris et désélectionne la ligne, perdant le focus.

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

Cordialement

+0

double possible de [* TableView ne commet pas de valeurs sur événement foyer perdu *] (https://stackoverflow.com/q/29576577/230513). – trashgod

Répondre

0

Vous pourriez être en mesure d'y arriver en ajoutant un écouteur d'événement sur table_view.focusedProperty. Cela afficherait le focus de la vue de table, mais pas le focus de chaque élément.

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



    });