gpt4 book ai didi

JavaFX 从另一个对话框打开一个对话框

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:48:42 25 4
gpt4 key购买 nike

我的应用程序中有以下工作流导致了问题:

单击按钮打开对话框 > 打开对话框 > 单击对话框中的按钮 > 显示确认警报 > 确认后关闭第一个对话框并打开一个新对话框

第二个对话框不允许输入到 TextField。我包含了一个显示问题的 SSCE。还有一件奇怪的事情是,如果您尝试通过单击“X”关闭第二个对话框,然后关闭警报,那么我就可以在该字段中输入内容。

public class DialogTest extends Application {

@Override
public void start(Stage primaryStage) {
Button button = new Button("Show Dialog");

VBox root = new VBox(10, button);
root.setAlignment(Pos.CENTER);

Scene scene = new Scene(root, 350, 120);
primaryStage.setScene(scene);
primaryStage.show();

button.setOnAction(event -> {
Dialog<Pair<String, String>> dialog = getDialog(scene.getWindow(), "Dialog 1", true);
dialog.showAndWait();
});
}

public static void main(String[] args) {
launch(args);
}

public Dialog<Pair<String, String>> getDialog(Window owner, String title, boolean addButton) {
Dialog<Pair<String, String>> dialog = new Dialog<>();
dialog.setTitle(title);
dialog.initOwner(owner);
dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);

if(addButton) {
Button button = new Button("Show Dialog");
dialog.getDialogPane().setContent(button);
button.setOnAction(event -> {
Alert alert = new Alert(AlertType.CONFIRMATION, "Are you sure?", ButtonType.YES, ButtonType.NO);
alert.initOwner(owner);
if(alert.showAndWait().get() == ButtonType.YES) {
dialog.close();
Dialog<Pair<String, String>> dialog2 = getDialog(owner, "Dialog 2", false);
TextField textField = new TextField();
dialog2.getDialogPane().setContent(textField);
dialog2.getDialogPane().getScene().getWindow().setOnCloseRequest(closeEvent -> {
closeEvent.consume();
if(textField.getText().trim().isEmpty()) {
Alert alert2 = new Alert(AlertType.ERROR, "Please enter a value", ButtonType.OK);
alert2.initOwner(dialog2.getDialogPane().getScene().getWindow());
alert2.showAndWait();
}
});
dialog2.showAndWait();
}
});
}

return dialog;
}
}

最佳答案

问题

如前所述,您遇到了模态问题。

解决方案

以下代码将演示一个解决方案,其中询问用户是否真的要打印以及打印后结束数字是否正确。

(注意,我使用了 here 中的 IntField 类)

import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBar.ButtonData;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.stage.Window;

public class DialogTest extends Application {

Region veil;
ProgressIndicator indicator;

IntField startingNumber = new IntField(0, 999999, 0);
IntField endingNumber = new IntField(startingNumber.getValue(), 999999, startingNumber.getValue() + 1);
ButtonType printButtonType = new ButtonType("Print", ButtonData.OK_DONE);
Stage stage;

@Override
public void start(Stage primaryStage) {
stage = primaryStage;
Button button = new Button("Print Checks");

VBox box = new VBox(10, button);
box.setAlignment(Pos.CENTER);

veil = new Region();
veil.setStyle("-fx-background-color: rgba(0, 0, 0, 0.3);");
veil.setVisible(false);

indicator = new ProgressIndicator();
indicator.setMaxHeight(60);
indicator.setMinWidth(60);
indicator.setVisible(false);

StackPane root = new StackPane(box, veil, indicator);

root.setAlignment(Pos.CENTER);

Scene scene = new Scene(root, 400, 400);
primaryStage.setScene(scene);
primaryStage.show();

button.setOnAction((event) -> {
Dialog<ButtonType> dialog
= getCheckPrintDialog(primaryStage, "Enter starting check number");
dialog.showAndWait()
.filter(result -> result == printButtonType)
.ifPresent(result -> {
// this is for this example only, normaly you already have this value
endingNumber.setValue(startingNumber.getValue() + 1);
printChecks(startingNumber.getValue(), endingNumber.getValue());
});
});
}

public static void main(String[] args) {
launch(args);
}

public <R extends ButtonType> Dialog getCheckPrintDialog(Window owner, String title) {
Dialog<R> dialog = new Dialog<>();
dialog.initOwner(owner);
dialog.setTitle(title);
dialog.getDialogPane().getButtonTypes().addAll(printButtonType, ButtonType.CANCEL);

Button btOk = (Button) dialog.getDialogPane().lookupButton(printButtonType);
btOk.addEventFilter(ActionEvent.ACTION, event -> {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "Print Checks? Are you sure?", ButtonType.YES, ButtonType.NO);
alert.showAndWait()
.filter(result -> result == ButtonType.NO)
.ifPresent(result -> event.consume());
});

GridPane grid = new GridPane();
grid.setHgap(10);
grid.setVgap(10);

Text from = new Text("Starting Number:");
grid.add(from, 0, 0);

grid.add(startingNumber, 1, 0);

dialog.getDialogPane().setContent(grid);
return dialog;
}

private void printChecks(int from, int to) {

Task<Void> task = new Task<Void>() {
@Override
protected Void call() throws Exception {
Thread.sleep(5000);
return null;
}
};

task.setOnSucceeded((event) -> {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "Has the last check, the number: " + endingNumber.getValue() + "?", ButtonType.YES, ButtonType.NO);
alert.initOwner(stage);
Button btnNo = (Button) alert.getDialogPane().lookupButton(ButtonType.NO);
btnNo.addEventFilter(ActionEvent.ACTION, e -> {
Dialog<ButtonType> newEndNum = new Dialog<>();
newEndNum.setTitle("Enter the ending check number");
newEndNum.initOwner(stage);
newEndNum.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
GridPane grid = new GridPane();
grid.setHgap(10);
grid.setVgap(10);

Text toUser = new Text("Ending Number:");
grid.add(toUser, 0, 0);

grid.add(endingNumber, 1, 0);

newEndNum.getDialogPane().setContent(grid);
newEndNum.showAndWait().filter(result -> result == ButtonType.CANCEL)
.ifPresent(result -> e.consume());
});
alert.showAndWait();
});
veil.visibleProperty().bind(task.runningProperty());
indicator.visibleProperty().bind(task.runningProperty());
new Thread(task).start();
}

}

工作申请

  1. 主窗口:

Main

  1. 打印对话框:

PrintDialog

  1. 点击“打印”后(警报已本地化,对我来说是德语):

Confirm

  1. 单击"is"后,“打印对话框”关闭并显示进度(在此示例中为 5 秒)

Progress

  1. 打印完成后会出现一个对话框,要求输入正确的结束编号

Confirm2

  1. 如果您单击"is",则一切都已完成,如果您单击“否”,则会打开另一个对话框以输入正确的结束值

EndingNumber

关于JavaFX 从另一个对话框打开一个对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32635918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com