JavaFX对另一个窗口中一个窗口的元素的操作

时间:2018-11-09 07:09:37

标签: java javafx

请帮助我解决问题。有两个fxml文件及其控制器:

sample.fxml, its controller ControllerMain (main window of the program)
find_win.fxml, its ControllerFind controller (modal window "text search")

在模式窗口find_win.fxml中,有一个TextField,在其中输入了搜索文本,单击“查找”按钮时,ControllerFind必须处理该单击并调用搜索方法,并在的TextArea元素中突出显示搜索文本。 sample.fxml窗口。

<fx: include source = "sample.fxml" fx: id = "textAreaOne" />

和ControllerFind控制器对ControllerMain的继承无助于实现解决方案-第一种情况是整个窗口标记完全包含在模式窗口中,第二种情况是java.lang.reflect.InvocationTargetException在对TextArea进行操作时返回。

如何从另一个窗口对一个窗口的元素执行操作?

2 个答案:

答案 0 :(得分:0)

在这种情况下与Windows进行可视通信,最好使用TextInputDialog这样的东西:

@Override
    public void start(Stage primaryStage){

        Button btn=new Button("Click");
        VBox vbox=new VBox();
        vbox.setAlignment(Pos.CENTER);
        vbox.getChildren().addAll(btn);
        Scene scene=new Scene(vbox, 200,200);

        btn.setOnAction(e->
        {
            TextInputDialog dialog=new TextInputDialog();
            Optional<String> result = dialog.showAndWait();
            if (result.isPresent()){
                System.out.println(result.get());
            }
        });
        primaryStage.setScene(scene);
        primaryStage.show();
    }

但是突出显示文本并非易事。 您可以对TextArea文本进行字符串搜索,将其与另一个窗口的结果进行比较,然后通过

突出显示
textArea.getSelectedRange(firstIndex, lastIndex);

firstIndex和lastIndex是我们正在搜索的单词的textArea文本的索引。然后在每次单击时单击按钮,以在文本内显示下一个单词出现并突出显示它。但是,如果您坚持要同时突出显示单词的每个实例,我建议您使用RichTextFX

答案 1 :(得分:0)

我在其他地方找到了解决方案。感谢安蒂扎姆同志,他试图提供帮助,但对我的需求并不了解。

解决方案描述为here is

简而言之,有必要创建一个控制器父实例的实例以及一个将控制器父实例的实例作为参数的子控制器的方法。从控制器父级打开新窗口后,获取控制器子级的实例,并通过创建的方法“ this”对其进行指示。

此外,在子控制器中,可以访问父控制器的元素。

controller-parent:

useEffect

控制子:

package sample;

public class ControllerMain {

    private ControllerFind children;  // controller-child

    //main-window
    @FXML
    public TextArea textAreaOne;
    @FXML
    public MenuItem findMenuItem;

    public void findAction(ActionEvent actionEvent) {
        try {
            Stage stageFind = new Stage();
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("FXML/find_win.fxml"));
            Parent root = loader.load();
            stageFind.setTitle("Find");
            stageFind.setMinHeight(200);
            stageFind.setMinWidth(150);
            stageFind.setResizable(false);
            stageFind.setScene(new Scene(root));
            stageFind.getIcons().add(new Image("image/search.png"));
            stageFind.initModality(Modality.NONE);
            stageFind.show();

            children = loader.getController(); //getting controller of window find_win.fxml
            children.setParent(this);   //setting parent of the controller-child - this

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}