自定义JavaFX对话框
我想创建一个自定义JavaFX对话框。到目前为止,我已经创造了这样的东西:自定义JavaFX对话框,java,javafx,dialog,Java,Javafx,Dialog,我想创建一个自定义JavaFX对话框。到目前为止,我已经创造了这样的东西: public class LoginDialog extends Dialog { public LoginDialog(Data data) { try { FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/LoginDialog.fxml")); Parent roo
public class LoginDialog extends Dialog {
public LoginDialog(Data data) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/LoginDialog.fxml"));
Parent root = loader.load();
LoginDialogController controller = loader.<LoginDialogController>getController();
controller.setModel(new LoginModel(data));
getDialogPane().setContent(root);
} catch (IOException e) {
e.printStackTrace();
}
}
}
公共类LoginDialog扩展对话框{
公共登录日志(数据){
试一试{
FXMLLoader=newFXMLLoader(getClass().getResource(“fxml/LoginDialog.fxml”);
父根=loader.load();
LoginDialogController控制器=loader.getController();
controller.setModel(新的LoginModel(数据));
getDialogPane().setContent(根目录);
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
但是——一开始我不相信这是正确的方法
其次,我希望在showAndWait()调用之后,使用LoginDialog.fxml文件中声明的按钮关闭这个LoginDialog。可能吗?如何设置返回值?从控制器关闭窗口:
public class LoginDialogController {
@FXML
private Button button ;
@FXML
private void handleButtonPress() {
button.getScene().getWindow().hide();
}
// ...
}
(在FXML中,您需要类似于
的内容)
要返回值,请指定对话框的类型并设置结果转换器:
public class LoginDialog extends Dialog<SomeDataType> {
public LoginDialog(Data data) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/LoginDialog.fxml"));
Parent root = loader.load();
LoginDialogController controller = loader.<LoginDialogController>getController();
controller.setModel(new LoginModel(data));
getDialogPane().setContent(root);
setResultConverter(buttonType -> {
SomeDataType someData = ... ;
return someData ;
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
公共类LoginDialog扩展对话框{
公共登录日志(数据){
试一试{
FXMLLoader=newFXMLLoader(getClass().getResource(“fxml/LoginDialog.fxml”);
父根=loader.load();
LoginDialogController控制器=loader.getController();
controller.setModel(新的LoginModel(数据));
getDialogPane().setContent(根目录);
setResultConverter(按钮类型->{
SomeDataType someData=;
返回一些数据;
});
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
显然,您可以在结果转换器中引用控制器、对其调用方法等,因此您可以根据用户在UI中的操作返回不同的值。从控制器关闭窗口:
public class LoginDialogController {
@FXML
private Button button ;
@FXML
private void handleButtonPress() {
button.getScene().getWindow().hide();
}
// ...
}
(在FXML中,您需要类似于
的内容)
要返回值,请指定对话框的类型并设置结果转换器:
public class LoginDialog extends Dialog<SomeDataType> {
public LoginDialog(Data data) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/LoginDialog.fxml"));
Parent root = loader.load();
LoginDialogController controller = loader.<LoginDialogController>getController();
controller.setModel(new LoginModel(data));
getDialogPane().setContent(root);
setResultConverter(buttonType -> {
SomeDataType someData = ... ;
return someData ;
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
公共类LoginDialog扩展对话框{
公共登录日志(数据){
试一试{
FXMLLoader=newFXMLLoader(getClass().getResource(“fxml/LoginDialog.fxml”);
父根=loader.load();
LoginDialogController控制器=loader.getController();
controller.setModel(新的LoginModel(数据));
getDialogPane().setContent(根目录);
setResultConverter(按钮类型->{
SomeDataType someData=;
返回一些数据;
});
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
显然,您可以在结果转换器中引用控制器、对其调用方法等,因此您可以根据用户在UI中的操作返回不同的值。您可以使用以下方法创建对话框
public void popup() {
final Stage dialog = new Stage();
dialog.setTitle("Confirmation");
Button yes = new Button("Yes");
Button no = new Button("No");
Label displayLabel = new Label("What do you want to do ?");
displayLabel.setFont(Font.font(null, FontWeight.BOLD, 14));
dialog.initModality(Modality.NONE);
dialog.initOwner((Stage) tableview.getScene().getWindow());
HBox dialogHbox = new HBox(20);
dialogHbox.setAlignment(Pos.CENTER);
VBox dialogVbox1 = new VBox(20);
dialogVbox1.setAlignment(Pos.CENTER_LEFT);
VBox dialogVbox2 = new VBox(20);
dialogVbox2.setAlignment(Pos.CENTER_RIGHT);
dialogHbox.getChildren().add(displayLabel);
dialogVbox1.getChildren().add(yes);
dialogVbox2.getChildren().add(no);
yes.addEventHandler(MouseEvent.MOUSE_CLICKED,
new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
// inside here you can use the minimize or close the previous stage//
dialog.close();
}
});
no.addEventHandler(MouseEvent.MOUSE_CLICKED,
new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
dialog.close();
}
});
dialogHbox.getChildren().addAll(dialogVbox1, dialogVbox2);
Scene dialogScene = new Scene(dialogHbox, 500, 40);
dialogScene.getStylesheets().add("//style sheet of your choice");
dialog.setScene(dialogScene);
dialog.show();
}
public void popup(){
最终阶段对话框=新阶段();
对话框。设置标题(“确认”);
按钮是=新按钮(“是”);
按钮编号=新按钮(“编号”);
Label displayLabel=新标签(“您想做什么?”);
displayLabel.setFont(Font.Font(null,fontwweight.BOLD,14));
dialog.initModality(Modality.NONE);
dialog.initOwner((Stage)tableview.getScene().getWindow());
HBox对话框HBox=新的HBox(20);
对话框HBox.setAlignment(位置中心);
VBox对话框VBOX1=新的VBox(20);
对话框VBOX1.设置对齐(位置居中左);
VBox对话框VBOX2=新的VBox(20);
对话框VBOX2.设置对齐(右中位置);
dialogHbox.getChildren().add(displayLabel);
dialogVbox1.getChildren().add(是);
dialogVbox2.getChildren().add(否);
是的。addEventHandler(MouseEvent.MOUSE_单击,
新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent e){
//在这里,您可以使用最小化或关闭前一阶段//
dialog.close();
}
});
no.addEventHandler(MouseEvent.MOUSE_单击,
新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent e){
dialog.close();
}
});
dialogHbox.getChildren().addAll(dialogVbox1,dialogVbox2);
场景dialogScene=新场景(dialogHbox,500,40);
dialogScene.getStylesheets().add(“//您选择的样式表”);
dialog.setScene(dialogScene);
dialog.show();
}
我更喜欢这种方法,因为我不必创建单独的控制器,而且我会得到一个弹出窗口您可以使用以下方法创建一个对话框
public void popup() {
final Stage dialog = new Stage();
dialog.setTitle("Confirmation");
Button yes = new Button("Yes");
Button no = new Button("No");
Label displayLabel = new Label("What do you want to do ?");
displayLabel.setFont(Font.font(null, FontWeight.BOLD, 14));
dialog.initModality(Modality.NONE);
dialog.initOwner((Stage) tableview.getScene().getWindow());
HBox dialogHbox = new HBox(20);
dialogHbox.setAlignment(Pos.CENTER);
VBox dialogVbox1 = new VBox(20);
dialogVbox1.setAlignment(Pos.CENTER_LEFT);
VBox dialogVbox2 = new VBox(20);
dialogVbox2.setAlignment(Pos.CENTER_RIGHT);
dialogHbox.getChildren().add(displayLabel);
dialogVbox1.getChildren().add(yes);
dialogVbox2.getChildren().add(no);
yes.addEventHandler(MouseEvent.MOUSE_CLICKED,
new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
// inside here you can use the minimize or close the previous stage//
dialog.close();
}
});
no.addEventHandler(MouseEvent.MOUSE_CLICKED,
new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
dialog.close();
}
});
dialogHbox.getChildren().addAll(dialogVbox1, dialogVbox2);
Scene dialogScene = new Scene(dialogHbox, 500, 40);
dialogScene.getStylesheets().add("//style sheet of your choice");
dialog.setScene(dialogScene);
dialog.show();
}
public void popup(){
最终阶段对话框=新阶段();
对话框。设置标题(“确认”);
按钮是=新按钮(“是”);
按钮编号=新按钮(“编号”);
Label displayLabel=新标签(“您想做什么?”);
displayLabel.setFont(Font.Font(null,fontwweight.BOLD,14));
dialog.initModality(Modality.NONE);
dialog.initOwner((Stage)tableview.getScene().getWindow());
HBox对话框HBox=新的HBox(20);
对话框HBox.setAlignment(位置中心);
VBox对话框VBOX1=新的VBox(20);
对话框VBOX1.设置对齐(位置居中左);
VBox对话框VBOX2=新的VBox(20);
对话框VBOX2.设置对齐(右中位置);
dialogHbox.getChildren().add(displayLabel);
dialogVbox1.getChildren().add(是);
dialogVbox2.getChildren().add(否);
是的。addEventHandler(MouseEvent.MOUSE_单击,
新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent e){
//在这里,您可以使用最小化或关闭前一阶段//
dialog.close()