【问题标题】:Why my TableView not getting refreshed or auto updated?为什么我的 TableView 没有刷新或自动更新?
【发布时间】:2015-10-30 09:06:54
【问题描述】:

我尝试了很多,但是当单击添加按钮时,我在文本字段中输入的值没有填充到表格视图中。请给我一个解决方案,以便在我单击添加按钮时将值填充到表格视图中!

 public class Refreshtable  extends Application {
  @FXML
   private TextField fname;
    private final TableView<Person> table = new TableView<>();
   private final ObservableList<Person> data =
            FXCollections.observableArrayList(
            new Person("Jacob"));
   final HBox hb = new HBox();
 public static void main(String[] args) {
        launch(args);
    }
     @Override
    public void start(Stage primarystage) {
        Scene scene = new Scene(new Group());
//        this.primaryStage.setTitle("Table View Sample");
      primarystage.setWidth(450);
     primarystage.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"));
 table.setItems(data);
        table.getColumns().addAll(firstNameCol);
    final Button addButton = new Button("Add");
        addButton.setOnAction((ActionEvent e) -> {
          System.out.println("u entered");
           try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(Refreshtable.class.getResource("newaddframe.fxml"));
     AnchorPane anchorpane = (AnchorPane) loader.load();
       Stage dialogStage = new Stage();
        dialogStage.setTitle("Main");
            dialogStage.initModality(Modality.WINDOW_MODAL);
       Scene scenee = new Scene(anchorpane);
            dialogStage.setScene(scenee);
dialogStage.showAndWait();
           } catch (IOException es) {
            es.printStackTrace();}
        });
        hb.getChildren().addAll(addButton);
         final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        vbox.getChildren().addAll( table, hb);

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

  primarystage.setScene(scene);
        primarystage.show();
    }
    @FXML
    private void addd(){
    data.add(new Person(
                    fname.getText()));
            fname.clear();

            }
 public static class Person {
 private final SimpleStringProperty firstName;
 private Person(String fName) {
 this.firstName = new SimpleStringProperty(fName);
         }
 public String getFirstName() {
            return firstName.get();
        }
 public void setFirstName(String fName) {
            firstName.set(fName);
        }


    }
} 

【问题讨论】:

  • 您将新数据保存在数据库中,但从未将其添加到支持 TableView 的 ObservableList data
  • 在您的update() 中,只需使用文本字段值创建一个新的 UserData 实例并将其添加到data
  • 查看this example。我添加的答案没有任何作用。如果您在运行时遇到问题,请创建 Minimal, Complete, and Verifiable example 并将其添加到您的问题中。
  • @ItachiUchiha 使用上面的示例可以在该框架内向 tableview 添加项目。我的要求是从新框架添加项目,如上图所示。请帮助我

标签: javafx javafx-2 javafx-8 auto-update


【解决方案1】:

我不会谈论你的代码中的(很多)问题,并保持简短的回答,解决你原来的问题。

您需要将用户输入的数据添加到支持 TableView 的 ObservableList 中。

@FXML
private void update()
{ 
   ...
   // Create new instance of UserData
   UserData userData = new UserData(name.getText(), country.getText());
   // Add it to the backing list
   data.add(userData);
}

【讨论】:

    【解决方案2】:

    示例刷新tableview代码:

    Cloud.java

    public class Cloud extends Application {
    
        private Stage primaryStage;
        private BorderPane rootLayout;
    
        /**
         * The data as an observable list of Persons.
         */
        private ObservableList<Person> personData = FXCollections.observableArrayList();
    
        /**
         * Constructor
         */
        public Cloud() {
         }
    
        /**
         * Returns the data as an observable list of Persons. 
         * @return
         */
        public ObservableList<Person> getPersonData() {
            return personData;
        }
    
        @Override
        public void start(Stage primaryStage) {
            this.primaryStage = primaryStage;
            this.primaryStage.setTitle("AddressApp");
    
            // Set the application icon.
            this.primaryStage.getIcons().add(new Image("file:resources/images/address_book_32.png"));
    
    
    
            showPersonOverview();
        }
    
        /**
         * Initializes the root layout and tries to load the last opened
         * person file.
         */
    
    
        /**
         * Shows the person overview inside the root layout.
         */
        public void showPersonOverview() {
            try {
                // Load person overview.
                FXMLLoader loader = new FXMLLoader();
                loader.setLocation(Cloud.class.getResource("root.fxml"));
                AnchorPane personOverview = (AnchorPane) loader.load();
    Stage dialogStagee = new Stage();
                dialogStagee.setTitle("Edit Person");
                dialogStagee.initModality(Modality.WINDOW_MODAL);
                dialogStagee.initOwner(primaryStage);
                Scene scene = new Scene(personOverview);
                dialogStagee.setScene(scene);
    
    
    
                // Give the controller access to the main app.
               rootcontroller controller = loader.getController();
                controller.setMainApp(this);
    dialogStagee.showAndWait();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * Opens a dialog to edit details for the specified person. If the user
         * clicks OK, the changes are saved into the provided person object and true
         * is returned.
         * 
         * @param person the person object to be edited
         * @return true if the user clicked OK, false otherwise.
         */
        public boolean showPersonEditDialog(Person person) {
            try {
                // Load the fxml file and create a new stage for the popup dialog.
                FXMLLoader loader = new FXMLLoader();
                loader.setLocation(Cloud.class.getResource("add.fxml"));
                AnchorPane page = (AnchorPane) loader.load();
    
                // Create the dialog Stage.
                Stage dialogStage = new Stage();
                dialogStage.setTitle("Edit Person");
                dialogStage.initModality(Modality.WINDOW_MODAL);
                dialogStage.initOwner(primaryStage);
                Scene scene = new Scene(page);
                dialogStage.setScene(scene);
    
                // Set the person into the controller.
                addcontroller controller = loader.getController();
                controller.setDialogStage(dialogStage);
                controller.setPerson(person);
    
                // Set the dialog icon.
                dialogStage.getIcons().add(new Image("file:resources/images/edit.png"));
    
                // Show the dialog and wait until the user closes it
                dialogStage.showAndWait();
    
    
            } catch (IOException e) {
                e.printStackTrace();
    
            }
            return false;
        }
    
    
        public Stage getPrimaryStage() {
            return primaryStage;
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    Person.java

    public class Person {
    
        private final StringProperty firstName;
        private final StringProperty lastName;
    
    
        /**
         * Default constructor.
         */
        public Person() {
            this(null, null);
        }
    
        /**
         * Constructor with some initial data.
         * 
         * @param firstName
         * @param lastName
         */
        public Person(String firstName, String lastName) {
            this.firstName = new SimpleStringProperty(firstName);
            this.lastName = new SimpleStringProperty(lastName);
    
    
        }
    
        public String getFirstName() {
            return firstName.get();
        }
    
        public void setFirstName(String firstName) {
            this.firstName.set(firstName);
        }
    
        public StringProperty firstNameProperty() {
            return firstName;
        }
    
        public String getLastName() {
            return lastName.get();
        }
    
        public void setLastName(String lastName) {
            this.lastName.set(lastName);
        }
    
        public StringProperty lastNameProperty() {
            return lastName;
        }
    
    
    }
    

    addcontroller.java

          public class addcontroller {
    
                @FXML
                private TextField firstNameField;
                @FXML
                private TextField lastNameField;
    
    
    
                private Stage dialogStage;
                private Person person;
               // private boolean okClicked = false;
    
    
    
                public void setDialogStage(Stage dialogStage) {
                    this.dialogStage = dialogStage;
                }
    
                /**
                 * Sets the person to be edited in the dialog.
                 * 
                 * @param person
                 */
                public void setPerson(Person person) {
                    this.person = person;}
    
    
                @FXML
                private void handleOk() {
    
                        person.setFirstName(firstNameField.getText());
                        person.setLastName(lastNameField.getText());
    
                        dialogStage.close();
    
                }
            }
    

    rootcontroller.java

     public class rootcontroller {
                @FXML
                private TableView<Person> personTable;
                @FXML
                private TableColumn<Person, String> firstNameColumn;
                @FXML
                private TableColumn<Person, String> lastNameColumn;
    
    
    
                // Reference to the main application.
                private Cloud mainApp;
    
                /**
                 * The constructor.
                 * The constructor is called before the initialize() method.
                 */
                public rootcontroller() {
                }
                @FXML
                private void initialize() {
                    // Initialize the person table with the two columns.
                    firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
                    lastNameColumn.setCellValueFactory(cellData -> cellData.getValue().lastNameProperty());
                   }
    
                public void setMainApp(Cloud mainApp) {
                    this.mainApp = mainApp;
                    personTable.setItems(mainApp.getPersonData());
                }
                @FXML
                private void handleNewPerson() {
                    Person tempPerson = new Person();
                    System.out.println("1");
                    mainApp.showPersonEditDialog(tempPerson);
                 mainApp.getPersonData().add(tempPerson);
    
                }
               }
    

    root.fxml

     <AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="cloud.rootcontroller">
           <children>
              <TableView fx:id="personTable" layoutX="215.0" layoutY="106.0" prefHeight="200.0" prefWidth="200.0">
                <columns>
                  <TableColumn fx:id="firstNameColumn" prefWidth="75.0" text="name" />
                  <TableColumn fx:id="lastNameColumn" prefWidth="75.0" text="country" />
                </columns>
              </TableView>
              <Button layoutX="415.0" layoutY="334.0" mnemonicParsing="false" onAction="#handleNewPerson" text="add" />
           </children>
        </AnchorPane>
    

    add.fxml

    <AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="cloud.addcontroller">
       <children>
          <TextField fx:id="firstNameField" layoutX="97.0" layoutY="113.0" />
          <TextField fx:id="lastNameField" layoutX="259.0" layoutY="113.0" />
          <Button layoutX="451.0" layoutY="113.0" mnemonicParsing="false" onAction="#handleOk" text="save" />
       </children>
    </AnchorPane>
    

    【讨论】:

    • dialogStage 的实例传递给控制器​​并不是一个很好的解决方案。更好的解决方案是在控制器内部定义一个 BooleanProperty 并将 dialogStage 关闭属性绑定到它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 2011-10-10
    • 2018-03-13
    相关资源
    最近更新 更多