user1414600
user1414600

Reputation: 85

How to populate TableView data on the other screen TextField in JavaFX 2.0

I am having problem in populating data from a table in one screen to a Text Field in the other screen. I have two classes FirstClass containing a textbox and a button. On pressing a button a second window is opened containing a Table of values. As the user double clicks a row the value of the second column of the row should be inserted into the textbox of the FirstClass. Code of both the classes is attached. Thanking you in anticipation.

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class FirstClass extends Application {
public static void main(String[] args) {
    launch(args);
}

@Override
public void start(final Stage primaryStage) {
    primaryStage.setTitle("First Class");

    GridPane gridpane = new GridPane();
    gridpane.setPadding(new Insets(5));
    gridpane.setHgap(5);
    gridpane.setVgap(5);

    final TextField userNameFld = new TextField();
    gridpane.add(userNameFld, 1, 1);
    Button btn = new Button();
    btn.setText("Show Table");
    gridpane.add(btn, 1, 3);

    btn.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            String a = TableClass.showDialog(primaryStage, true, "Table Window" );
            userNameFld.setText(a);
        }
    });

    StackPane root = new StackPane();

    Scene scene =new Scene(root, 300, 250);

    root.getChildren().addAll(gridpane);
    primaryStage.setScene(scene);
    primaryStage.show();
 }
}







import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class TableClass extends Stage {

private static TableClass dialog;
private static String value = "";


public static class Person {
    private final SimpleStringProperty firstName;
    private final SimpleStringProperty lastName;


    private Person(String fName, String lName) {
        this.firstName = new SimpleStringProperty(fName);
        this.lastName = new SimpleStringProperty(lName);
    }

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


 private TableView<Person> table = new TableView<Person>();
    private final ObservableList<Person> data = 
        FXCollections.observableArrayList(
            new Person("JACK", "BROWN"),
            new Person("JOHN", "VIANNEYS"),
            new Person("MICHAEL", "NELSON"),
            new Person("WILLIAM", " CAREY")
        );


public TableClass(Stage owner, boolean modality, String title) {
    super();
    initOwner(owner);
    Modality m = modality ? Modality.APPLICATION_MODAL : Modality.NONE;
    initModality(m);
    setOpacity(1);
    setTitle(title);

    StackPane root = new StackPane();

    Scene scene = new Scene(root, 750, 750);

    setScene(scene);
    GridPane gridpane = new GridPane();
    gridpane.setPadding(new Insets(5));
    gridpane.setHgap(5);
    gridpane.setVgap(5);


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

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



    table.setItems(data);
    table.getColumns().addAll(firstNameCol, lastNameCol);



    table.setOnMouseClicked(new EventHandler<MouseEvent>() {

           public void handle(MouseEvent me) {

                   if (me.getClickCount() >= 2) {
                       String  srr = table.getItems().get    (table.getSelectionModel().getSelectedIndex()).getLastName();
                       value = srr;
                       dialog.hide();
                      }
               }
        });


    gridpane.add(table, 1, 5,1,20 );
    root.getChildren().add(gridpane);
    }


public static String showDialog(Stage stg, Boolean a , String title){
      dialog = new TableClass( stg,a, title);
      dialog.show();
      return value;
  }
 }

Upvotes: 0

Views: 3472

Answers (1)

assylias
assylias

Reputation: 328568

The quick and easy way (but it introduces coupling between the 2 classes) would be to pass userNameFld to your showDialog method and make it a member of TableClass. You can then change its value from the TableClass class.

A better way would be to bind the value of userNameFld to value.

Upvotes: 1

Related Questions