Search code examples
javamysqljavafxfxmlscenebuilder

Set value of TextField from another window in javafx


I have a TextField set on Action(press enter) to open another fxml window that shows a table of choices(hundreds of choices). Basically I need that 2nd window to set the text of the textfield on the first window.

@FXML //this pops out a 2nd window where i can choose a person. Set from Scene Builder
private void pickperson(ActionEvent event) throws IOException {
    Parent parent = FXMLLoader.load(getClass().getResource("/fxml/personpicker.fxml"));
    Scene scene = new Scene(parent);
    Stage stage = new Stage();
    stage.setScene(scene);
    stage.centerOnScreen();
    stage.show();
} 

@FXML //when i click "use selected" this gets executed
private void use(ActionEvent event) {
    Person person0 = table.getSelectionModel().getSelectedItem();
    int id = person0.getId();
    String name = person0.getNAME();
    final Clipboard clipboard = Clipboard.getSystemClipboard();
    final ClipboardContent content = new ClipboardContent();
    content.putString(Integer.toString(id)); //i tried clipboard but when i paste, nothing is pasted
    Stage stage = (Stage) useselected.getScene().getWindow();//closes the window
    stage.close();
}

I have a table on the 2nd window with a button labeled: "use selected". I want to make it so that the moment click "use selected", the window closes and at the same time set the text field from the selection.

Edit: I got the clipboard to work by adding

Clipboard.getSystemClipboard().setContent(content);

Now, I just need to paste the value directly after the window closes; as if CRTL+V was pressed.


Solution

  • According to your code, the "parent" Stage, i.e. the one containing the TextField, is the owner of the Stage displaying the three buttons. Hence you can simply call method getOwner() in the child Stage in order to access the parent Stage. Once you have a reference to the parent Stage, you can access its nodes and manipulate them.

    I only changed two files in your code.

    1. Parent.fxml - I added the id attribute to TextField.
    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.scene.control.Label?>
    <?import javafx.scene.control.TextField?>
    <?import javafx.scene.layout.AnchorPane?>
    
    <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="266.0" prefWidth="394.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="test.ParentController">
       <children>
          <TextField id="txtFld" layoutX="123.0" layoutY="121.0" onAction="#picker" />
          <Label layoutX="140.0" layoutY="86.0" text="Press enter to choose" />
       </children>
    </AnchorPane>
    
    1. ChildController.java - I added the method handleEvent(int)
    package test;
    
    import java.net.URL;
    import java.util.ResourceBundle;
    
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.AnchorPane;
    import javafx.stage.Stage;
    
    public class ChildController implements Initializable {
        @FXML
        AnchorPane ap;
        @FXML
        private Button btnone;
        @FXML
        private Button btntwo;
        @FXML
        private Button btnthree;
    
        @Override
        public void initialize(URL url, ResourceBundle rb) {
            // TODO
        }
    
        @FXML
        private void one(ActionEvent event) {
            handleEvent(1);
        }
    
        @FXML
        private void two(ActionEvent event) {
            handleEvent(2);
        }
    
        @FXML
        private void three(ActionEvent event) {
            handleEvent(3);
        }
    
        private void handleEvent(int chosenNumber) {
            Stage stage = (Stage) ap.getScene().getWindow();
            Stage owner = (Stage) stage.getOwner();
            Scene scene = owner.getScene();
            Parent root = scene.getRoot();
            TextField txtFld = (TextField) root.lookup("#txtFld");
            txtFld.setText(String.valueOf(chosenNumber));
            stage.close();
        }
    }