0

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.

xyzit
  • 89
  • 1
  • 8
  • You don't need to use the system clipboard in order to update the contents of a text field in one [Stage](https://docs.oracle.com/javase/8/javafx/api/javafx/stage/Stage.html) when you perform an action in a second `Stage`. In order to show you how to do that, it would help if you posted a [mcve]. Include both the java code and the contents of your FXML files. – Abra Oct 05 '19 at 13:34
  • @Abra I hope its not too late. I made a barebones version of what I am trying to do. https://github.com/alexislyndon/testcodes – xyzit Oct 09 '19 at 01:23

1 Answers1

0

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();
    }
}
Abra
  • 19,142
  • 7
  • 29
  • 41