我正在编写一个应用程序,当时我需要使用相同的自定义弹出窗口才能单击不同的按钮。现在,弹出窗口只是一个简单的"您确定吗?好的/取消"窗口,但是后来它将扩展到包含更多自定义的功能...因此我无法使用Quickie Dialog内置。
这很奇怪。按下按钮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/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();
});
}
}
一些想法...
我使用Scene -Builder生成FXML。当我为该Anchorpane分配控制器类时,我从下拉菜单中选择了" sl.view.popup1controller"。所以我很确定这是对的。
另外:我浏览了其他" Javafx弹出窗口"帖子,但我看不到专门解决我的问题的帖子。许多帖子就像以下帖子一样,基本上是" 为什么不使用这些其他弹出选项而不是重新发明轮子?",例如:Javafx 2自定义弹出窗格就我而言,i do 想要重新发明轮子,因为我需要弹出窗口来携带更多的拼写功能,它们将不是简单的对话框。
如果要在控制器初始化控制器时执行代码,请将其放在initialize()
方法中(请参阅文档):
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();
});
}
}