当前位置: 首页 > 知识库问答 >
问题:

弹出窗口启动,但控制器没有。。。?

施飞鸿
2023-03-14

我正在编写一个应用程序,我需要在单击不同按钮时出现相同的自定义弹出窗口。现在弹出窗口只是一个简单的“你确定吗?确定/取消”窗口,但稍后它将扩展以包括更多自定义功能......所以我不能使用内置的快速对话框。

奇怪的是。当按下按钮X时,弹出窗口(在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/popup 1 controller . 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分配控制器类时,我从下拉菜单中选择了“sl.view.PopUp1Controller”。所以我很确定这是对的。

此外:我已经查看了其他“JavaFX Popup”帖子,但我没有看到一个专门解决我的问题的帖子。很多帖子都像下面的帖子,基本上是“为什么不使用这些其他弹出选项而不是重新发明轮子?”例如:JavaFX 2自定义弹出窗格在我的例子中,我确实想重新发明轮子,因为我需要我的弹出窗口来承载更常见的功能,它们不会是简单的对话框。

共有1个答案

邵亦
2023-03-14

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

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();
        });
    }
}
 类似资料:
  • 问题内容: 我必须做一个应用程序的演示,该应用程序有一个server.jar和client.jar。两者都有命令行参数,并且是可执行的。我需要启动两个server.jar实例和两个client.jar实例。 我以为使用批处理文件是可行的方法,但是批处理文件会执行第一个命令(即> server.bat [argument1] [argument2]),并且除非关闭第一个实例,否则不会执行其他任何操作

  • 我有一个控制器。用于场景的java。fxml和控制器设置。用于WindowsSettings.fxml的java。在控制器中。java I使用以下方法创建一个新的弹出窗口(无对话框): 我想在关闭新弹出窗口时保存设置,但这不适用于stage.setOnCloseRequest。

  • 描述 (Description) 可以使用相关的app方法动态创建popover,如下所示 - myApp.popover(popoverHTML, target, removeOnClose) - 此方法接受以下参数 popoverHTML - 它是popoverHTML的HTML字符串。 target - 它是一个HTMLElement or string (with CSS Selector

  • 我在我的网站上有一个按钮,允许用户通过Yodlee/Plaid使用弹出的登录屏幕登录到他们的银行。问题是弹出窗口被safari和chrome手机屏蔽了。弹出窗口在桌面上工作。我读到过safari和chrome会阻止所有弹出窗口,如果用户没有点击按钮启动弹出窗口,或者弹出窗口从点击事件开始超过一秒。 我的问题是,在启动弹出窗口之前,我的前端必须调用我的后端来检索令牌。所有这些都需要超过一秒钟的时间,

  • 问题内容: 我想使用Firefox浏览器,使用RSelenium从网站下载文件。我正确地完成了所有操作(导航,选择正确的元素并写下我想要的内容);现在,我单击“下载”按钮,然后打开一个Firefox弹出窗口,并询问我是否要下载文件或“用…打开”。 不幸的是,由于隐私限制,我无法编写示例。 我的问题是:如何在需要时切换到弹出窗口/警报并单击“确定”? 我尝试了以下方法,但均未成功: 我也试过了 但是

  • Popup 是一种可以包含任何Html内容的弹出窗口,从App的主内容区域上弹出。 Popup 和其他所有的遮罩图层一样,是所谓的“临时视图”的一部分。 Popup 布局 Popup 布局相当简单. 你所需要做的就是将放到 body 里正确的位置上: <div class="modal modal-no-buttons"> ... <div class="popup"> An