2

Simply when i add a textfield and clicked on add button my value is not getting inserted to tableview

I tried a lot but my value entered in the textfield is not getting populated to tableview when add button is clicked.Please give me a solution to populate values into the tableview whenever i click on add button !

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


    }
} 
Seban
  • 184
  • 4
  • 20
  • 1
    You are saving the new data in the database but never add it to the ObservableList `data` which is backing the TableView. – ItachiUchiha Oct 30 '15 at 09:08
  • Inside your `update()` just create a new UserData instance with the textfield values and add it to `data`. – ItachiUchiha Oct 30 '15 at 09:27
  • 1
    Check out [this example](https://docs.oracle.com/javase/8/javafx/user-interface-tutorial/table-view.htm#CJAFABCH). The answer that I have added does nothing extra. If you have issues running, please create a [Minimal, Complete, and Verifiable example](http://stackoverflow.com/help/mcve) and add it to your question. – ItachiUchiha Oct 30 '15 at 10:56
  • @ItachiUchiha using above example its possible to add items to tableview within that Frame.My requirement is to add item from new frame as shown in above image.plz help me – Seban Nov 03 '15 at 13:17

2 Answers2

4

I will not talk about the (many) issues with your code and keep the answer short, addressing your original problem.

You need to add the data entered by the user to the ObservableList backing the TableView.

@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);
}
ItachiUchiha
  • 36,135
  • 10
  • 122
  • 176
0

Sample refresh tableview code:

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>
thmspl
  • 2,437
  • 3
  • 22
  • 48
  • 2
    Passing an instance of the `dialogStage` into the controller is not a very good solution. A better solution would be to define a `BooleanProperty` inside the controller and bind dialogStage close property to it. – ItachiUchiha Nov 11 '15 at 12:33