如何通过子控制器为父控制器中的元素设置FXML属性

时间:2019-05-27 16:09:02

标签: javafx

我试图更改某些TextField的可见性,并在从另一个控制器调用的方法中初始化新的工具提示。

因此,在父窗口中,我有一个默认设置为不可见的TextField和一个用于打开新子窗口的按钮(设置为showAndWait)。在子窗口中,我有一个TableView,当从中选择一个值时,TextField应该出现在父窗口中,并且在工具提示中设置了选定的值。

因此,从下面的代码中,我只能从该方法中获取打印的消息。我很可能错了,但我最好的猜测是,从子级中选择值时,我应该调用父级的initialize方法。

//父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>

//父控制器

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

      }   );}}

编辑: 因此,基本上,我尝试通过父控制器中的方法(从子控制器调用)为父窗口中的Textfield设置新的工具提示。我也尝试在子控制器中使用controller.textField.setTooltip(new Tooltip(“ ...”)),但没有成功。我想我必须在修改后重新加载父窗口,但我不知道如何。 (我认为设置可见性的问题来自同一问题)

谢谢。

0 个答案:

没有答案