当前位置: 首页 > 知识库问答 >
问题:

JavaFx 2.1、2.2 TableView更新问题

楮阳
2023-03-14

我的应用程序使用JPA,将数据读入TableView,然后修改和显示它们。该表刷新了JavaFX2.0.3下修改的记录。在JavaFX2.1、2.2下,表不再刷新更新。我发现其他人也有类似问题。我的计划是继续使用2.0.3直到有人在2.1和2.2下修复了这个问题。现在我知道它不是一个错误,不会被修复。嗯,我不知道该怎么处理这个。以下是从示例演示中修改的代码,以显示该问题。如果我从表中添加一个新记录或删除一个旧记录,表刷新很好。如果我修改了一条记录,那么在执行添加、删除或排序操作之前,表不会刷新更改。如果我删除修改的记录并再次添加它,表将刷新。但修改后的记录放在表的按钮处。那么,如果我删除修改过的记录,添加相同的记录,然后将记录移动到原来的位置,表就不会再刷新了。下面是一个完整的代码,请对此点亮一些光。

    import javafx.application.Application;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.geometry.HPos;
    import javafx.geometry.Insets;
    import javafx.geometry.Pos;
    import javafx.scene.Group;
    import javafx.scene.Scene;
    import javafx.scene.control.*;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.layout.GridPane;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.VBox;
    import javafx.scene.text.Font;
    import javafx.stage.Modality;
    import javafx.stage.Stage;
    import javafx.stage.StageStyle;

    public class Main extends Application {

        private TextField firtNameField = new TextField();
        private TextField lastNameField = new TextField();
        private TextField emailField = new TextField();
        private Stage editView;
        private Person fPerson;

        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);
            }
        }
        private TableView<Person> table = new TableView<Person>();
        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(535);
            stage.setHeight(535);
            editView = new Stage();

            final Label label = new Label("Address Book");
            label.setFont(new Font("Arial", 20));

            TableColumn firstNameCol = new TableColumn("First Name");
            firstNameCol.setCellValueFactory(
                    new PropertyValueFactory<Person, String>("firstName"));
            firstNameCol.setMinWidth(150);

            TableColumn lastNameCol = new TableColumn("Last Name");
            lastNameCol.setCellValueFactory(
                    new PropertyValueFactory<Person, String>("lastName"));
            lastNameCol.setMinWidth(150);
            TableColumn emailCol = new TableColumn("Email");
            emailCol.setMinWidth(200);
            emailCol.setCellValueFactory(
                    new PropertyValueFactory<Person, String>("email"));

            table.setItems(data);
            table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
    //--- create a edit button and a editPane to edit person   
            Button addButton = new Button("Add");
            addButton.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                    fPerson = null;
                    firtNameField.setText("");
                    lastNameField.setText("");
                    emailField.setText("");
                    editView.show();
                }
            });
            Button editButton = new Button("Edit");
            editButton.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                    if (table.getSelectionModel().getSelectedItem() != null) {
                        fPerson = table.getSelectionModel().getSelectedItem();
                        firtNameField.setText(fPerson.getFirstName());
                        lastNameField.setText(fPerson.getLastName());
                        emailField.setText(fPerson.getEmail());
                        editView.show();
                    }
                }
            });
            Button deleteButton = new Button("Delete");
            deleteButton.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                    if (table.getSelectionModel().getSelectedItem() != null) {
                        data.remove(table.getSelectionModel().getSelectedItem());
                    }
                }
            });
            HBox addEditDeleteButtonBox = new HBox();
            addEditDeleteButtonBox.getChildren().addAll(addButton, editButton, deleteButton);
            addEditDeleteButtonBox.setAlignment(Pos.CENTER_RIGHT);
            addEditDeleteButtonBox.setSpacing(3);

            GridPane editPane = new GridPane();
            editPane.getStyleClass().add("editView");
            editPane.setPadding(new Insets(3));
            editPane.setHgap(5);
            editPane.setVgap(5);
            Label personLbl = new Label("Person:");
            editPane.add(personLbl, 0, 1);
            GridPane.setHalignment(personLbl, HPos.LEFT);

            firtNameField.setPrefWidth(250);
            lastNameField.setPrefWidth(250);
            emailField.setPrefWidth(250);
            Label firstNameLabel = new Label("First Name:");
            Label lastNameLabel = new Label("Last Name:");
            Label emailLabel = new Label("Email:");

            editPane.add(firstNameLabel, 0, 3);
            editPane.add(firtNameField, 1, 3);
            editPane.add(lastNameLabel, 0, 4);
            editPane.add(lastNameField, 1, 4);
            editPane.add(emailLabel, 0, 5);
            editPane.add(emailField, 1, 5);
            GridPane.setHalignment(firstNameLabel, HPos.RIGHT);
            GridPane.setHalignment(lastNameLabel, HPos.RIGHT);
            GridPane.setHalignment(emailLabel, HPos.RIGHT);

            Button saveButton = new Button("Save");
            saveButton.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                    if (fPerson == null) {
                        fPerson = new Person(
                                firtNameField.getText(),
                                lastNameField.getText(),
                                emailField.getText());
                        data.add(fPerson);
                    } else {
                        int k = -1;
                        if (data.size() > 0) {
                            for (int i = 0; i < data.size(); i++) {
                                if (data.get(i) == fPerson) {
                                    k = i;
                                }
                            }
                        }
                        fPerson.setFirstName(firtNameField.getText());
                        fPerson.setLastName(lastNameField.getText());
                        fPerson.setEmail(emailField.getText());
                        data.set(k, fPerson);
                        table.setItems(data);

    //  The following will work, but edited person has to be added to the button
    //
    //                    data.remove(fPerson);
    //                    data.add(fPerson);

    // add and remove refresh the table, but now move edited person to original spot, 
    // it failed again with the following code
    //                    while (data.indexOf(fPerson) != k) {
    //                        int i = data.indexOf(fPerson);
    //                        Collections.swap(data, i, i - 1);
    //                    }
                    }
                    editView.close();
                }
            });
            Button cancelButton = new Button("Cancel");
            cancelButton.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                    editView.close();
                }
            });

            HBox saveCancelButtonBox = new HBox();
            saveCancelButtonBox.getChildren().addAll(saveButton, cancelButton);
            saveCancelButtonBox.setAlignment(Pos.CENTER_RIGHT);
            saveCancelButtonBox.setSpacing(3);

            VBox editBox = new VBox();
            editBox.getChildren().addAll(editPane, saveCancelButtonBox);

            Scene editScene = new Scene(editBox);
            editView.setTitle("Person");
            editView.initStyle(StageStyle.UTILITY);
            editView.initModality(Modality.APPLICATION_MODAL);
            editView.setScene(editScene);
            editView.close();

            final VBox vbox = new VBox();
            vbox.setSpacing(5);
            vbox.getChildren().addAll(label, table, addEditDeleteButtonBox);
            vbox.setPadding(new Insets(10, 0, 0, 10));

            ((Group) scene.getRoot()).getChildren().addAll(vbox);

            stage.setScene(scene);
            stage.show();
        }
    }

共有1个答案

姬俊驰
2023-03-14

请参阅更新TableView中的行的答案。添加这些getter就会正常工作。
此外,由于数据是一个ObservableList,它被设置为tableView的项,因此对此数据列表的任何更改也将反映到Table.GetItems()。即不需要再次table.setitems(data)

 类似资料:
  • 你好 我正在使用JavaFXSDK开发一个程序。我想要一个像C#那样的消息框: 我希望使用JavaFXSDK有这样的功能。非常感谢回答。

  • 我用myBatis。Single record语句工作正常,但当我尝试使用foreach执行记录列表的更新时,出现了一个关于映射的错误,这有点奇怪,因为它对Single record工作正常。 下面是我得到的错误: 原因:org。阿帕奇。伊巴蒂斯。类型TypeException:无法为映射设置参数:ParameterMapping{property=''frch\u item_0.fieldOne

  • 我在重新启动后更新了Android SDK,它说更新ADT(如下图所示)。然后我尝试从和更新它。但是它说,

  • 我正在尝试使用TypeORM将多个JSON数据插入到一个名为integration_data的表中。我的应用程序使用NodeJS。但是不知何故,我无法使用TypeORM形成查询,以在PostgresSQL中对我的JSON数据执行批量UpSert。 以下是我的逻辑:- 在这里,我传递的是原始数据,它是一个 JSON 对象数组。 实体:- 这里,integration_data表中的emp_data列

  • 问题内容: 我有一个表,与领域,和日期时间在一个MySQL的InnoDB数据库。 每次流程获得一项工作时,它都会“签出”该工作以将其标记为已开始,以便其他任何流程都无法对其进行处理。 我希望一个会话的单个过程能够: 寻找排名最高的工作 将此作业的开始字段更新为当前时间戳 而不会冒任何其他会话也可以选择并开始排名最高的工作的风险。其他会议也随时改变排名。 这是我的尝试: 但这失败了: 无论如何,我宁

  • 问题内容: 我正在尝试通过将新记录更新或插入新的记录到 voice_user_table中 来更新数据库。该表定义如下: 这是我正在使用的查询。我实际上对所有值都使用了参数,但是出于测试目的,我将其替换为我确定应该可以使用的值。用户名 aaa@aaa.com 存在。 运行查询后,我得到的输出是: 尽管应该插入新值,但是因为该行在数据库上尚不存在。当我仅使用insert子句手动插入一行,然后执行上面

  • 我用的是拉威尔作曲家。我正在加载way/generators包,当我运行composer update时,会出现以下错误: 加载具有包信息更新依赖项的composer存储库(包括require dev) 致命错误:内存中允许的内存大小536870912字节已用尽(尝试分配67108864字节)phar:///usr/local/Cellar/composer/1.0.0-alpha8/libexe

  • 失败:生成失败,出现异常。 错误:任务“:firebase_core:compiledebugjavawithjavac”执行失败。 找不到tools.jar。请检查C:\Program Files\Java\JRE1.8.0_251是否包含有效的JDK安装。 更新后,我开始出现这样的错误。有人能帮忙吗?