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

    }

}

           

以上是 javafx 2列示例TableView 的全部内容, 来源链接: utcz.com/z/348701.html

回到顶部