javaFX :: popup窗口启动,但控制器没有...?

时间:2017-12-21 18:50:13

标签: javafx controller popup

我正在编写一个应用程序,我需要在单击不同按钮时显示相同的自定义弹出窗口。现在弹出窗口只是一个简单的“你确定吗?确定/取消”窗口,但后来它将扩展为包含更多自定义功能...所以我不能使用quickie Dialog内置插件。

这是奇怪的事情。当按下按钮X时,popUp(在FXML中定义)启动就好了,但我的控制器类似乎没有运行。我不认为你能做到这一点。我无法弄清楚的是 为什么 控制器没有运行。如果控制器不能正常工作,我会认为应用程序会崩溃。

这里是一个按钮将调用以启动弹出窗口的代码:

private void popUpLaunch(Button caller){
    Stage popUpStage = new Stage();
    Parent root;

    try {
        root = FXMLLoader.load(getClass().getResource("popUp1.fxml"));
        popUpStage.setScene(new Scene(root));
        popUpStage.initModality(Modality.APPLICATION_MODAL);    // popup
        popUpStage.initOwner(caller.getScene().getWindow());
        popUpStage.showAndWait();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

所有这一切都很有效。这是完整的FXML,/ src / sl / view / popUp1.fxml:

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="130.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sl.view.PopUp1Controller">
   <children>
      <Text fx:id="popUpMessageText" layoutX="14.0" layoutY="14.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Message Goes Here" textAlignment="CENTER" wrappingWidth="577.6708984375" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <font>
            <Font size="38.0" />
         </font>
      </Text>
      <Button fx:id="btnPopUpOK" layoutX="126.0" layoutY="68.0" mnemonicParsing="false" prefHeight="31.0" prefWidth="157.0" text="OK" />
      <Button fx:id="btnPopUpCancel" layoutX="286.0" layoutY="68.0" mnemonicParsing="false" prefHeight="31.0" prefWidth="169.0" text="Cancel" />
   </children>
</AnchorPane>

窗口加载得很好。最后,这是完整的控制器,/ src / sl / view / PopUp1Controller.java:

package sl.view;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class PopUp1Controller {
    @FXML Text  popUpMessageText;
    @FXML Button    btnPopUpOK;
    @FXML Button    btnPopUpCancel;
    Stage stage;

    public void start(Stage stage) throws Exception{
        System.out.println("Popup controller launched!");   // never reach this... so the controller is not launching???
        this.stage = stage;
        popUpMessageText.setText("Interesting message here!");
        btnPopUpOK.setOnAction(event -> {
            System.out.println("You cliced OK...");
        });
        btnPopUpCancel.setOnAction(event -> {
            System.out.println("You cliced Cancel");
            stage.close();
        });
    }
}

一些想法......

我使用SceneBuilder生成FXML。当我为该AnchorPane分配Controller类时,我从下拉菜单中选择了“sl.view.PopUp1Controller”。所以我很确定这是对的。

另外:我查看了其他“JavaFX Popup”帖子,但我没有看到专门解决我的问题的帖子。很多帖子都像下面的帖子基本上是,“为什么不使用这些其他弹出选项而不是重新发明轮子?”例如: JavaFX 2 custom popup pane 在我的情况下,我 想要重新发明轮子,因为我需要我的弹出窗口来传递更常用的功能,它们不会是简单的对话框。

1 个答案:

答案 0 :(得分:1)

如果希望控制器中的代码在初始化控制器时执行,请将其放在initialize()方法中(参见documentation):

public class PopUp1Controller {
    @FXML Text  popUpMessageText;
    @FXML Button    btnPopUpOK;
    @FXML Button    btnPopUpCancel;

    public void initialize() {
        System.out.println("Popup controller launched!");   // never reach this... so the controller is not launching???
        popUpMessageText.setText("Interesting message here!");
        btnPopUpOK.setOnAction(event -> {
            System.out.println("You cliced OK...");
        });
        btnPopUpCancel.setOnAction(event -> {
            System.out.println("You cliced Cancel");
            btnPopupCancel.getScene().getWindow().hide();
        });
    }
}