javafX8初探(表格)

来源:互联网 发布:windows server win7 编辑:程序博客网 时间:2024/06/06 01:09

本节,我们将学习如何在JavaFX应用中操作表格。比如:添加表格,为表格填充数据、编辑表格的行。

JavaFX中提供了一些类让我们更方便的操作表格,最重要的类有TableViewTableColumnTableCell。我们可以通过实现数据模型和使用单元工厂来填充表格。这些类都提供了列排序和改变列的宽度。

下图是一个典型的地址信息表格:

创建一个表格

import javafx.application.Application;import javafx.geometry.Insets;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.Label;import javafx.scene.control.TableColumn;import javafx.scene.control.TableView;import javafx.scene.layout.VBox;import javafx.scene.text.Font;import javafx.stage.Stage; public class TableViewSample extends Application {     private final TableView table = new TableView();    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("Address Book");        label.setFont(new Font("Arial", 20));         table.setEditable(true);         TableColumn firstNameCol = new TableColumn("First Name");        TableColumn lastNameCol = new TableColumn("Last Name");        TableColumn emailCol = new TableColumn("Email");                table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);         final VBox vbox = new VBox();        vbox.setSpacing(5);        vbox.setPadding(new Insets(10, 0, 0, 10));        vbox.getChildren().addAll(label, table);         ((Group) scene.getRoot()).getChildren().addAll(vbox);         stage.setScene(scene);        stage.show();    }}


 

表格控件是通过TableView来创建的,并且被添加到一个VBox的容器中,当然你也可以直接把这个表格添加到场景中。

然后创建了3列来存数地址信息:first namelast name和邮件地址。列是通过TableColumn类来创建的。

然后getColumns方法添加了之前创建的3列。在你自己的应用中,你可以通过这个方法来增加和删除列。

编译运行,如下图所示:

你也可以通过setVisble来设置列的可见性。举个例子。如果你的例子中药隐藏邮件地址的列。你可以使用下面的方法。EmailCol.setVisble(false);

如果你的表格需要更复杂的表现,比如需要嵌套列。举个例子,如果一个人有两个邮件地址。那么我们需要两列来存储第一个和第二个邮件地址。我们创建两个子列,然后通过getColumns方法来添加这两个子列。

TableColumn firstEmailCol = new TableColumn("Primary");TableColumn secondEmailCol = new TableColumn("Secondary");emailCol.getColumns().addAll(firstEmailCol, secondEmailCol);


 

编译运行代码,如下图所示:

尽管这个表格已经添加到我们的应用中了,但是其中没有内容,显示了“No content

In table.我们可以通过,setPlaceholder方法来指定没有数据时的显示内容。

定义数据模型

当你创建了一个表格后,最好能有一个类定义数据模型,然后提供方法和域来更好的为表格服务。下面我们使用一个Person类来定义地址表格中的数据。

public static class Person {    private final SimpleStringProperty firstName;    private final SimpleStringProperty lastName;    private final SimpleStringProperty email;     private Person(String fName, String lName, String email) {        this.firstName = new SimpleStringProperty(fName);        this.lastName = new SimpleStringProperty(lName);        this.email = new SimpleStringProperty(email);    }     public String getFirstName() {        return firstName.get();    }    public void setFirstName(String fName) {        firstName.set(fName);    }            public String getLastName() {        return lastName.get();    }    public void setLastName(String fName) {        lastName.set(fName);    }        public String getEmail() {        return email.get();    }    public void setEmail(String fName) {        email.set(fName);    }        }


 

其中firstNamelastNameemail 3个字符串属性代表了表格中的3个列。

而且没有属性都提供了getset方法。Get方法返回属性的值,set方法为属性赋值。

然后我们使用Person类创建一个ObservableList,定义多行数据。

final ObservableList<Person> data = FXCollections.observableArrayList(    new Person("Jacob", "Smith", "jacob.smith@example.com"),    new Person("Isabella", "Johnson", "isabella.johnson@example.com"),    new Person("Ethan", "Williams", "ethan.williams@example.com"),    new Person("Emma", "Jones", "emma.jones@example.com"),    new Person("Michael", "Brown", "michael.brown@example.com"));


 

下一步就是把这些数据关联到表格中。我们可以通过属性的名字来关联。

firstNameCol.setCellValueFactory(    new PropertyValueFactory<>("firstName"));lastNameCol.setCellValueFactory(    new PropertyValueFactory<>("lastName"));emailCol.setCellValueFactory(    new PropertyValueFactory<>("email"));


 

SetCellValueFactory方法指定了每一列的单元格工厂。单元格的属性是通过PropertyValueFactory类来实现的。

当数据模型定义好后并且也关联到表格中,我们就这个通过TableViewsetItems方法来添加数据了。代码如下:

import javafx.application.Application;import javafx.beans.property.SimpleStringProperty;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.TableColumn;import javafx.scene.control.TableView;import javafx.scene.control.cell.PropertyValueFactory;import javafx.scene.layout.VBox;import javafx.scene.text.Font;import javafx.stage.Stage; public class TableViewSample extends Application {     private final TableView<Person> table = new TableView<>();    private final ObservableList<Person> data =        FXCollections.observableArrayList(            new Person("Jacob", "Smith", "jacob.smith@example.com"),            new Person("Isabella", "Johnson", "isabella.johnson@example.com"),            new Person("Ethan", "Williams", "ethan.williams@example.com"),            new Person("Emma", "Jones", "emma.jones@example.com"),            new Person("Michael", "Brown", "michael.brown@example.com")        );       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(450);        stage.setHeight(500);         final Label label = new Label("Address Book");        label.setFont(new Font("Arial", 20));         table.setEditable(true);         TableColumn firstNameCol = new TableColumn("First Name");        firstNameCol.setMinWidth(100);        firstNameCol.setCellValueFactory(                new PropertyValueFactory<>("firstName"));         TableColumn lastNameCol = new TableColumn("Last Name");        lastNameCol.setMinWidth(100);        lastNameCol.setCellValueFactory(                new PropertyValueFactory<>("lastName"));         TableColumn emailCol = new TableColumn("Email");        emailCol.setMinWidth(200);        emailCol.setCellValueFactory(                new PropertyValueFactory<>("email"));         table.setItems(data);        table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);         final VBox vbox = new VBox();        vbox.setSpacing(5);        vbox.setPadding(new Insets(10, 0, 0, 10));        vbox.getChildren().addAll(label, table);         ((Group) scene.getRoot()).getChildren().addAll(vbox);         stage.setScene(scene);        stage.show();    }     public static class Person {         private final SimpleStringProperty firstName;        private final SimpleStringProperty lastName;        private final SimpleStringProperty email;         private Person(String fName, String lName, String email) {            this.firstName = new SimpleStringProperty(fName);            this.lastName = new SimpleStringProperty(lName);            this.email = new SimpleStringProperty(email);        }         public String getFirstName() {            return firstName.get();        }         public void setFirstName(String fName) {            firstName.set(fName);        }         public String getLastName() {            return lastName.get();        }         public void setLastName(String fName) {            lastName.set(fName);        }         public String getEmail() {            return email.get();        }         public void setEmail(String fName) {            email.set(fName);        }    }} 

编译运行代码,如下图所示:

添加新行

import javafx.application.Application;import javafx.beans.property.SimpleStringProperty;import javafx.collections.FXCollections;import javafx.collections.ObservableList;import javafx.event.ActionEvent;import javafx.geometry.Insets;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.control.Label;import javafx.scene.control.TableColumn;import javafx.scene.control.TableView;import javafx.scene.control.TextField;import javafx.scene.control.cell.PropertyValueFactory;import javafx.scene.layout.HBox;import javafx.scene.layout.VBox;import javafx.scene.text.Font;import javafx.stage.Stage; public class TableViewSample extends Application {     private final TableView<Person> table = new TableView<>();    private final ObservableList<Person> data =            FXCollections.observableArrayList(            new Person("Jacob", "Smith", "jacob.smith@example.com"),            new Person("Isabella", "Johnson", "isabella.johnson@example.com"),            new Person("Ethan", "Williams", "ethan.williams@example.com"),            new Person("Emma", "Jones", "emma.jones@example.com"),            new Person("Michael", "Brown", "michael.brown@example.com"));    final HBox hb = new HBox();     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(450);        stage.setHeight(550);         final Label label = new Label("Address Book");        label.setFont(new Font("Arial", 20));         table.setEditable(true);         TableColumn firstNameCol = new TableColumn("First Name");        firstNameCol.setMinWidth(100);        firstNameCol.setCellValueFactory(                new PropertyValueFactory<>("firstName"));         TableColumn lastNameCol = new TableColumn("Last Name");        lastNameCol.setMinWidth(100);        lastNameCol.setCellValueFactory(                new PropertyValueFactory<>("lastName"));         TableColumn emailCol = new TableColumn("Email");        emailCol.setMinWidth(200);        emailCol.setCellValueFactory(                new PropertyValueFactory<>("email"));         table.setItems(data);        table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);         final TextField addFirstName = new TextField();        addFirstName.setPromptText("First Name");        addFirstName.setMaxWidth(firstNameCol.getPrefWidth());        final TextField addLastName = new TextField();        addLastName.setMaxWidth(lastNameCol.getPrefWidth());        addLastName.setPromptText("Last Name");        final TextField addEmail = new TextField();        addEmail.setMaxWidth(emailCol.getPrefWidth());        addEmail.setPromptText("Email");         final Button addButton = new Button("Add");        addButton.setOnAction((ActionEvent e) -> {            data.add(new Person(                    addFirstName.getText(),                    addLastName.getText(),                    addEmail.getText()));            addFirstName.clear();            addLastName.clear();            addEmail.clear();        });         hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton);        hb.setSpacing(3);         final VBox vbox = new VBox();        vbox.setSpacing(5);        vbox.setPadding(new Insets(10, 0, 0, 10));        vbox.getChildren().addAll(label, table, hb);         ((Group) scene.getRoot()).getChildren().addAll(vbox);         stage.setScene(scene);        stage.show();    }     public static class Person {         private final SimpleStringProperty firstName;        private final SimpleStringProperty lastName;        private final SimpleStringProperty email;         private Person(String fName, String lName, String email) {            this.firstName = new SimpleStringProperty(fName);            this.lastName = new SimpleStringProperty(lName);            this.email = new SimpleStringProperty(email);        }         public String getFirstName() {            return firstName.get();        }         public void setFirstName(String fName) {            firstName.set(fName);        }         public String getLastName() {            return lastName.get();        }         public void setLastName(String fName) {            lastName.set(fName);        }         public String getEmail() {            return email.get();        }         public void setEmail(String fName) {            email.set(fName);        }    }} 


运行,如下图所示:

排序

TableView类为表格提供了排序列的能力,用户可以通过单击列头来实现排序.第一次单击按照升序排列,第二次单击按照降序排列,第三次单击不排序。默认不排序。

用户也可以按照多行排序。当单击列头的是由按住Shift键就可以。如下图所示:

作为开发者,我们可以指定列的排序类型。可用通过setSortType方法来指定比如emailCol.setSortType(TableColumn.SortType.SESCENDING);

我们也可以通过setSortablefalse)方法来禁止排序。

编辑表格数据

import javafx.application.Application;import javafx.beans.property.SimpleStringProperty;import javafx.collections.FXCollections;import javafx.collections.ObservableList;import javafx.event.ActionEvent;import javafx.geometry.Insets;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.control.Label;import javafx.scene.control.TableColumn;import javafx.scene.control.TableColumn.CellEditEvent;import javafx.scene.control.TableView;import javafx.scene.control.TextField;import javafx.scene.control.cell.PropertyValueFactory;import javafx.scene.control.cell.TextFieldTableCell;import javafx.scene.layout.HBox;import javafx.scene.layout.VBox;import javafx.scene.text.Font;import javafx.stage.Stage; public class TableViewSample extends Application {     private final TableView<Person> table = new TableView<>();    private final ObservableList<Person> data =            FXCollections.observableArrayList(            new Person("Jacob", "Smith", "jacob.smith@example.com"),            new Person("Isabella", "Johnson", "isabella.johnson@example.com"),            new Person("Ethan", "Williams", "ethan.williams@example.com"),            new Person("Emma", "Jones", "emma.jones@example.com"),            new Person("Michael", "Brown", "michael.brown@example.com"));    final HBox hb = new HBox();     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(450);        stage.setHeight(550);         final Label label = new Label("Address Book");        label.setFont(new Font("Arial", 20));         table.setEditable(true);         TableColumn<Person, String> firstNameCol =             new TableColumn<>("First Name");        firstNameCol.setMinWidth(100);        firstNameCol.setCellValueFactory(            new PropertyValueFactory<>("firstName"));                firstNameCol.setCellFactory(TextFieldTableCell.<Person>forTableColumn());        firstNameCol.setOnEditCommit(            (CellEditEvent<Person, String> t) -> {                ((Person) t.getTableView().getItems().get(                        t.getTablePosition().getRow())                        ).setFirstName(t.getNewValue());        });          TableColumn<Person, String> lastNameCol =             new TableColumn<>("Last Name");        lastNameCol.setMinWidth(100);        lastNameCol.setCellValueFactory(            new PropertyValueFactory<>("lastName"));       lastNameCol.setCellFactory(TextFieldTableCell.<Person>forTableColumn());       lastNameCol.setOnEditCommit(            (CellEditEvent<Person, String> t) -> {                ((Person) t.getTableView().getItems().get(                        t.getTablePosition().getRow())                        ).setLastName(t.getNewValue());        });         TableColumn<Person, String> emailCol = new TableColumn<>("Email");        emailCol.setMinWidth(200);        emailCol.setCellValueFactory(            new PropertyValueFactory<>("email"));        emailCol.setCellFactory(TextFieldTableCell.<Person>forTableColumn());               emailCol.setOnEditCommit(            (CellEditEvent<Person, String> t) -> {                ((Person) t.getTableView().getItems().get(                        t.getTablePosition().getRow())                        ).setEmail(t.getNewValue());        });         table.setItems(data);        table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);         final TextField addFirstName = new TextField();        addFirstName.setPromptText("First Name");        addFirstName.setMaxWidth(firstNameCol.getPrefWidth());        final TextField addLastName = new TextField();        addLastName.setMaxWidth(lastNameCol.getPrefWidth());        addLastName.setPromptText("Last Name");        final TextField addEmail = new TextField();        addEmail.setMaxWidth(emailCol.getPrefWidth());        addEmail.setPromptText("Email");         final Button addButton = new Button("Add");        addButton.setOnAction((ActionEvent e) -> {            data.add(new Person(                    addFirstName.getText(),                    addLastName.getText(),                    addEmail.getText()));            addFirstName.clear();            addLastName.clear();            addEmail.clear();        });         hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton);        hb.setSpacing(3);         final VBox vbox = new VBox();        vbox.setSpacing(5);        vbox.setPadding(new Insets(10, 0, 0, 10));        vbox.getChildren().addAll(label, table, hb);         ((Group) scene.getRoot()).getChildren().addAll(vbox);         stage.setScene(scene);        stage.show();    }     public static class Person {         private final SimpleStringProperty firstName;        private final SimpleStringProperty lastName;        private final SimpleStringProperty email;         private Person(String fName, String lName, String email) {            this.firstName = new SimpleStringProperty(fName);            this.lastName = new SimpleStringProperty(lName);            this.email = new SimpleStringProperty(email);        }         public String getFirstName() {            return firstName.get();        }         public void setFirstName(String fName) {            firstName.set(fName);        }         public String getLastName() {            return lastName.get();        }         public void setLastName(String fName) {            lastName.set(fName);        }         public String getEmail() {            return email.get();        }         public void setEmail(String fName) {            email.set(fName);        }    }}


运行,如下图所示:

上面的例子,我们修改后需要按回车键才能生效,我们可以让当焦点改变的时候就生效:

import javafx.application.Application;import javafx.beans.property.SimpleStringProperty;import javafx.beans.value.ObservableValue;import javafx.collections.FXCollections;import javafx.collections.ObservableList;import javafx.event.ActionEvent;import javafx.geometry.Insets;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.control.Label;import javafx.scene.control.TableCell;import javafx.scene.control.TableColumn;import javafx.scene.control.TableColumn.CellEditEvent;import javafx.scene.control.TableView;import javafx.scene.control.TextField;import javafx.scene.control.cell.PropertyValueFactory;import javafx.scene.layout.HBox;import javafx.scene.layout.VBox;import javafx.scene.text.Font;import javafx.stage.Stage;import javafx.util.Callback; public class TableViewSample extends Application {     private final TableView<Person> table = new TableView<>();    private final ObservableList<Person> data =            FXCollections.observableArrayList(            new Person("Jacob", "Smith", "jacob.smith@example.com"),            new Person("Isabella", "Johnson", "isabella.johnson@example.com"),            new Person("Ethan", "Williams", "ethan.williams@example.com"),            new Person("Emma", "Jones", "emma.jones@example.com"),            new Person("Michael", "Brown", "michael.brown@example.com"));    final HBox hb = new HBox();     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(450);        stage.setHeight(550);         final Label label = new Label("Address Book");        label.setFont(new Font("Arial", 20));         table.setEditable(true);                Callback<TableColumn<Person, String>,             TableCell<Person, String>> cellFactory                = (TableColumn<Person, String> p) -> new EditingCell();         TableColumn<Person, String> firstNameCol =             new TableColumn<>("First Name");        TableColumn<Person, String> lastNameCol =             new TableColumn<>("Last Name");        TableColumn<Person, String> emailCol =             new TableColumn<>("Email");         firstNameCol.setMinWidth(100);        firstNameCol.setCellValueFactory(            new PropertyValueFactory<>("firstName"));        firstNameCol.setCellFactory(cellFactory);                firstNameCol.setOnEditCommit(            (CellEditEvent<Person, String> t) -> {                ((Person) t.getTableView().getItems().get(                        t.getTablePosition().getRow())                        ).setFirstName(t.getNewValue());        });          lastNameCol.setMinWidth(100);        lastNameCol.setCellValueFactory(            new PropertyValueFactory<>("lastName"));        lastNameCol.setCellFactory(cellFactory);        lastNameCol.setOnEditCommit(            (CellEditEvent<Person, String> t) -> {                ((Person) t.getTableView().getItems().get(                        t.getTablePosition().getRow())                        ).setLastName(t.getNewValue());        });         emailCol.setMinWidth(200);        emailCol.setCellValueFactory(            new PropertyValueFactory<>("email"));        emailCol.setCellFactory(cellFactory);        emailCol.setOnEditCommit(            (CellEditEvent<Person, String> t) -> {                ((Person) t.getTableView().getItems().get(                        t.getTablePosition().getRow())                        ).setEmail(t.getNewValue());        });         table.setItems(data);        table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);         final TextField addFirstName = new TextField();        addFirstName.setPromptText("First Name");        addFirstName.setMaxWidth(firstNameCol.getPrefWidth());        final TextField addLastName = new TextField();        addLastName.setMaxWidth(lastNameCol.getPrefWidth());        addLastName.setPromptText("Last Name");        final TextField addEmail = new TextField();        addEmail.setMaxWidth(emailCol.getPrefWidth());        addEmail.setPromptText("Email");         final Button addButton = new Button("Add");        addButton.setOnAction((ActionEvent e) -> {            data.add(new Person(                    addFirstName.getText(),                    addLastName.getText(),                    addEmail.getText()));            addFirstName.clear();            addLastName.clear();            addEmail.clear();        });         hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton);        hb.setSpacing(3);         final VBox vbox = new VBox();        vbox.setSpacing(5);        vbox.setPadding(new Insets(10, 0, 0, 10));        vbox.getChildren().addAll(label, table, hb);         ((Group) scene.getRoot()).getChildren().addAll(vbox);         stage.setScene(scene);        stage.show();    }     public static class Person {         private final SimpleStringProperty firstName;        private final SimpleStringProperty lastName;        private final SimpleStringProperty email;         private Person(String fName, String lName, String email) {            this.firstName = new SimpleStringProperty(fName);            this.lastName = new SimpleStringProperty(lName);            this.email = new SimpleStringProperty(email);        }         public String getFirstName() {            return firstName.get();        }         public void setFirstName(String fName) {            firstName.set(fName);        }         public String getLastName() {            return lastName.get();        }         public void setLastName(String fName) {            lastName.set(fName);        }         public String getEmail() {            return email.get();        }         public void setEmail(String fName) {            email.set(fName);        }    }     class EditingCell extends TableCell<Person, String> {         private TextField textField;         public EditingCell() {        }         @Override        public void startEdit() {            if (!isEmpty()) {                super.startEdit();                createTextField();                setText(null);                setGraphic(textField);                textField.selectAll();            }        }         @Override        public void cancelEdit() {            super.cancelEdit();             setText((String) getItem());            setGraphic(null);        }         @Override        public void updateItem(String item, boolean empty) {            super.updateItem(item, empty);             if (empty) {                setText(null);                setGraphic(null);            } else {                if (isEditing()) {                    if (textField != null) {                        textField.setText(getString());                    }                    setText(null);                    setGraphic(textField);                } else {                    setText(getString());                    setGraphic(null);                }            }        }         private void createTextField() {            textField = new TextField(getString());            textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2);            textField.focusedProperty().addListener(                (ObservableValue<? extends Boolean> arg0,                 Boolean arg1, Boolean arg2) -> {                    if (!arg2) {                        commitEdit(textField.getText());                    }            });        }         private String getString() {            return getItem() == null ? "" : getItem().toString();        }    }}


 

为表格添加数据映射

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 tableView = new TableView<>(generateDataInMap());         tableView.setEditable(true);        tableView.getSelectionModel().setCellSelectionEnabled(true);        tableView.getColumns().setAll(firstDataColumn, secondDataColumn);        Callback<TableColumn<Map, String>, TableCell<Map, String>>            cellFactoryForMap = (TableColumn<Map, String> p) ->                 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, tableView);         ((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;    }}


 

如下图所示:

 


 

2 0