赞
踩
本节,我们将学习如何在JavaFX应用中操作表格。比如:添加表格,为表格填充数据、编辑表格的行。
JavaFX中提供了一些类让我们更方便的操作表格,最重要的类有TableView、TableColumn和TableCell。我们可以通过实现数据模型和使用单元工厂来填充表格。这些类都提供了列排序和改变列的宽度。
下图是一个典型的地址信息表格:
- 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 name 、last 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);
- }
-
- }
其中firstName,lastName和email 3个字符串属性代表了表格中的3个列。
而且没有属性都提供了get和set方法。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类来实现的。
当数据模型定义好后并且也关联到表格中,我们就这个通过TableView的setItems方法来添加数据了。代码如下:
- 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);
我们也可以通过setSortable(false)方法来禁止排序。
- 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;
- }
- }
如下图所示:
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。