我试图更改某些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(“ ...”)),但没有成功。我想我必须在修改后重新加载父窗口,但我不知道如何。 (我认为设置可见性的问题来自同一问题)
谢谢。