Как установить свойства FXML для элемента в родительском контроллере из дочернего контроллера - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь изменить видимость для некоторых TextFields и инициализировать новую подсказку в методе, который вызывается из другого контроллера.

Таким образом, в родительском окне у меня установлено TextField, по умолчанию не видимое, и кнопка для открытия нового дочернего окна (установлено как showAndWait).В дочернем окне у меня есть TableView, и когда в нем выбрано значение, TextField должен появиться в родительском окне с выбранным значением, заданным во всплывающей подсказке.

Так что из приведенного ниже кода я получаю только напечатанное сообщениеиз метода.Скорее всего, я ошибаюсь, но, скорее всего, я должен вызывать метод инициализации родителя при выборе значения из child.

// parent fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="javafxapplication4.JavaFXApplication4">
    <children>
      <TextField fx:id="textField" layoutX="208.0" layoutY="107.0" prefHeight="25.0" prefWidth="195.0" visible="false" />
      <Button fx:id="toChild" layoutX="262.0" layoutY="200.0" onAction="#toChild" mnemonicParsing="false" text="Child window" />
   </children>
</AnchorPane>

// parent controller

package javafxapplication4;

import java.io.IOException;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.control.Tooltip;
import javafx.scene.layout.StackPane;
import javafx.stage.Modality;
import javafx.stage.Stage;


public class JavaFXApplication4 extends Application {

    @FXML
    public TextField textField;

    @Override
    public void start(Stage primaryStage) throws IOException {
      Parent root = FXMLLoader.load(getClass().getResource("Parent.fxml"));
        Scene scene = new Scene(root);
       primaryStage.setScene(scene);
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }

// called onmouseclick by child's tableview
    public void execute()
    {

        System.out.println("Execute called... He wants his money back!");
     textField.setTooltip(new Tooltip("Value selected: "));
     textField.setVisible(true);

    }


// button for child window 

    public void toChild() throws IOException{
     FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getClassLoader().getResource("javafxapplication4/Child.fxml"));
        Parent parent = loader.load();
        Stage stage = new Stage();
        stage.initModality(Modality.APPLICATION_MODAL);
        stage.setScene(new Scene(parent));
        stage.showAndWait();
    }
}

// дочерний fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>


<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="javafxapplication4.ChildController">
   <children>
      <TableView fx:id="table" layoutX="101.0" layoutY="100.0" onMouseClicked="#select" prefHeight="200.0" prefWidth="442.0">
        <columns>
          <TableColumn prefWidth="75.0" text="C1" />
          <TableColumn prefWidth="75.0" text="C2" />
        </columns>
      </TableView>
   </children>
</AnchorPane>

// дочерний контроллер

package javafxapplication4;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.control.TableView;


public class ChildController implements Initializable {

  @FXML
  public TableView table;

    @Override
    public void initialize(URL url, ResourceBundle rb) {

    }    

// onmouseclick method for tableview
    public void select() throws IOException
    { 
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getClassLoader().getResource("javafxapplication4/Parent.fxml"));
        Parent parent = loader.load();
        JavaFXApplication4 controller = loader.getController();
        Class value = (Class) table.getSelectionModel().getSelectedItem();

        table.setOnMouseClicked(event -> {

        controller.execute();
      ((Node)(event.getSource())).getScene().getWindow().hide();

      }   );}}

Редактировать: Итак, в основном я попытался установить новую всплывающую подсказку для текстового поля вродительское окно через метод в родительском контроллере, который я вызвал из дочернего контроллера.Я также попытался с помощью controller.textField.setTooltip (new Tooltip ("...")) в дочернем контроллере, но безуспешно.Я думаю, я должен перезагрузить родительское окно после изменений, но я понятия не имею, как.(проблема с настройкой видимости, я думаю, из той же проблемы)

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...