2016-05-26 6 views
0

Ich benutze dieses Beispiel http://docs.oracle.com/javafx/2/ui_controls/table-view.htm wobei tableview auf MapValueFactory basiert.Javafx-Tabellenansicht MapValueFactory. Wie man eine Zelle editiert und den neuen Wert speichert

Jetzt habe ich die Situation, wenn editierte Werte nicht gespeichert werden. Meine Aktionen:

Drücken Sie "Enter" -> neuen Wert eingeben -> drücken Sie erneut "Enter" -> Ergebnis: Neuer Wert wird in der Zelle angezeigt.

Aber wenn ich wieder "Enter" in dieser Zelle drücken, wird der alte Wert anstelle von New Wert angezeigt.

Bitte helfen Sie mir zu verstehen, wie kann ich Änderungen nach dem Bearbeiten der Zelle speichern?

Example 12-12 Adding Map Data to the Table 

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 = "A"; 
    public static final String Column2MapKey = "B"; 

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

     final Label label = new Label("Student IDs"); 
     label.setFont(new Font("Arial", 20)); 

     TableColumn<Map, String> firstDataColumn = new TableColumn<>("Class A"); 
     TableColumn<Map, String> secondDataColumn = new TableColumn<>("Class B"); 

     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(label, 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 value1 = "A" + i; 
      String value2 = "B" + i; 

      dataRow.put(Column1MapKey, value1); 
      dataRow.put(Column2MapKey, value2); 

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

Antwort

1

Sie müssen die cellEditEvent mit setOnEditCommit definieren:

firstDataColumn.setOnEditCommit((CellEditEvent<Map<String, String>, String> t) -> { 
     ((Map<String, String>) t.getTableView().getItems().get(t.getTablePosition().getRow())).put(Column1MapKey, t.getNewValue()); 
    }); 
Verwandte Themen