2016-05-26 161 views
0

我正在使用此示例http://docs.oracle.com/javafx/2/ui_controls/table-view.htm其中tableview基于MapValueFactory。Javafx Tableview MapValueFactory。如何编辑单元格并保存新值

现在我遇到编辑值不保存的情况。我的动作:

按“Enter” - >输入新值 - >再次按“Enter” - >结果:新值显示在单元格中。

但是当我在这个单元格中再次按下“Enter”时,显示的是旧值而不是New值。

请帮我理解编辑单元格后如何保存更改?

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

回答

1

您需要定义与setOnEditCommit的cellEditEvent:

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