javafx 2列示例TableView
示例
表项
下列类别包含2个属性,分别是名称(String)和大小(double)。这两个属性都包装在JavaFX属性中,以允许TableView观察更改。
import javafx.beans.property.DoubleProperty; import javafx.beans.property.SimpleDoubleProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; public class Person { public Person(String name, double size) { this.size= new SimpleDoubleProperty(this, "size", size); this.name= new SimpleStringProperty(this, "name", name); } private final StringProperty name; private final DoubleProperty size; public final String getName() { return this.name.get(); } public final void setName(String value) { this.name.set(value); } public final StringProperty nameProperty() { return this.name; } public final double getSize() { return this.size.get(); } public final void setSize(double value) { this.size.set(value); } public final DoubleProperty sizeProperty() { return this.size; } }
样品申请
此应用程序显示TableView带有2列的;一个代表名字,一个代表大小Person。选择之一,Person将数据添加到TextField下方的,TableView并允许用户编辑数据。请注意,一旦提交了修改,它将TableView自动更新。
对每个TableColumn添加到TableViewa的对象cellValueFactory都分配一个。该工厂负责将表项目(Persons)转换为ObservableValues,这些项目包含应在表单元格中显示的值,并允许TableView侦听此值的任何更改。
import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.event.EventHandler; 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.TextFormatter; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; import javafx.util.Callback; import javafx.util.StringConverter; public class TableSample extends Application { @Override public void start(Stage primaryStage) { //tableview的数据。修改此列表会自动更新tableview ObservableList<Person> data = FXCollections.observableArrayList( new Person("John Doe", 1.75), new Person("Mary Miller", 1.70), new Person("Frank Smith", 1.80), new Person("Charlotte Hoffman", 1.80) ); TableView<Person> tableView = new TableView<>(data); //人名的表格列 TableColumn<Person, String> nameColumn = new TableColumn<>("Name"); nameColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() { @Override public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> param) { return param.getValue().nameProperty(); } }); //人数列 TableColumn<Person, Number> sizeColumn = new TableColumn<>("Size"); sizeColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, Number>, ObservableValue<Number>>() { @Override public ObservableValue<Number> call(TableColumn.CellDataFeatures<Person, Number> param) { return param.getValue().sizeProperty(); } }); //将列添加到tableview tableView.getColumns().addAll(nameColumn, sizeColumn); TextField name = new TextField(); TextField size = new TextField(); //将输入从文本字段转换为双精度 TextFormatter<Double> sizeFormatter = new TextFormatter<Double>(new StringConverter<Double>() { @Override public String toString(Double object) { return object == null ? "" : object.toString(); } @Override public Double fromString(String string) { if (string == null || string.isEmpty()) { return null; } else { try { double val = Double.parseDouble(string); return val < 0 ? null : val; } catch (NumberFormatException ex) { return null; } } } }); size.setTextFormatter(sizeFormatter); Button commit = new Button("Change Item"); commit.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { Person p = tableView.getSelectionModel().getSelectedItem(); p.setName(name.getText()); Double value = sizeFormatter.getValue(); p.setSize(value == null ? -1d : value); } }); //侦听选择中的更改以更新文本字段中的数据 tableView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Person>() { @Override public void changed(ObservableValue<? extends Person> observable, Person oldValue, Person newValue) { commit.setDisable(newValue == null); if (newValue != null) { sizeFormatter.setValue(newValue.getSize()); name.setText(newValue.getName()); } } }); HBox editors = new HBox(5, new Label("Name:"), name, new Label("Size: "), size, commit); VBox root = new VBox(10, tableView, editors); Scene scene = new Scene(root); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }