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

javafx对话框错误

蓟俊杰
2023-03-14

我正在学习如何在javafx中创建对话框,我写了一段代码,这给了我一个问题。错误在createLoginDialog方法中。

错误为“无法访问TryDialogBox类型的封闭实例。必须用TryDialogBox类型的封闭实例限定分配(例如x.new A(),其中x是TryDialogBox的实例)。

public class TryDialogBox extends Application {
    static Stage LOGIN_DIALOG;
    static int dx = 1;
    static int dy = 1;

    private static Stage createLoginDialog(Stage parent, boolean modal) {
        if (LOGIN_DIALOG != null) {
            LOGIN_DIALOG.close();
        }
        return new MyDialog(parent, modal, "welcom");
    }

    public void start(final Stage stage) {
        stage.setTitle("developing dialog");
        Group root = new Group();
        Scene scene = new Scene(root, 433, 312, Color.WHEAT);

        MenuBar menuBar = new MenuBar();
        menuBar.prefWidthProperty().bind(stage.widthProperty());

        Menu menu = new Menu("home");

        // add
        MenuItem newItem = new MenuItem("change password", null);
        newItem.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent event) {
                if (LOGIN_DIALOG == null) {
                    LOGIN_DIALOG = createLoginDialog(stage, true);
                }
                LOGIN_DIALOG.sizeToScene();
                LOGIN_DIALOG.show();
            }
        });

        menu.getItems().add(newItem);

        // add separator
        menu.getItems().add(new SeparatorMenuItem());

        // add non mdal menu item
        ToggleGroup modalGroup = new ToggleGroup();
        RadioMenuItem nonModalItem = RadioMenuItemBuilder.create()
                .toggleGroup(modalGroup).text("non modal").selected(true)
                .build();
        nonModalItem.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent event) {
                LOGIN_DIALOG = createLoginDialog(stage, false);
            }
        });
        menu.getItems().add(nonModalItem);
        // add modal
        RadioMenuItem modalItem = RadioMenuItemBuilder.create()
                .toggleGroup(modalGroup).text("modal").selected(true).build();
        modalItem.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent event) {
                LOGIN_DIALOG = createLoginDialog(stage, true);
            }
        });
        menu.getItems().add(modalItem);

        // add sep
        menu.getItems().add(new SeparatorMenuItem());

        // add exit
        MenuItem exitItem = new MenuItem("Exit", null);
        exitItem.setMnemonicParsing(true);
        exitItem.setAccelerator(new KeyCodeCombination(KeyCode.X,
                KeyCombination.CONTROL_DOWN));
        exitItem.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent event) {
                Platform.exit();
            }
        });
        menu.getItems().add(exitItem);

        // add menu
        menuBar.getMenus().add(menu);

        root.getChildren().add(menuBar);
        stage.setScene(scene);
        stage.show();

    }

    class MyDialog extends Stage {
        public MyDialog(Stage owner, boolean modality, String title) {
            super();
            initOwner(owner);
            Modality m = modality ? Modality.APPLICATION_MODAL : Modality.NONE;
            initModality(m);
            setOpacity(.90);
            setTitle(title);
            Group root = new Group();
            Scene scene = new Scene(root, 250, 150, Color.WHITE);
            setScene(scene);

            GridPane gridpane = new GridPane();
            gridpane.setPadding(new Insets(5));
            gridpane.setHgap(5);
            gridpane.setVgap(5);

            Label mainLabel = new Label("enter username & password");
            gridpane.add(mainLabel, 1, 0, 2, 1);

            Label userNamelbl = new Label("username");
            gridpane.add(userNamelbl, 0, 1);

            Label passwordlbl = new Label("password");
            gridpane.add(passwordlbl, 0, 2);

            // username textfield
            final TextField userNameFld = new TextField("Admin");
            gridpane.add(userNameFld, 1, 1);

            // password
            final PasswordField passwordFld = new PasswordField();
            passwordFld.setText("dwossap");
            gridpane.add(passwordFld, 1, 2);

            Button login = new Button("change");
            login.setOnAction(new EventHandler<ActionEvent>() {
                public void handle(ActionEvent event) {
                    close();
                }
            });

            gridpane.add(login, 1, 3);
            GridPane.setHalignment(login, HPos.RIGHT);
            root.getChildren().add(gridpane);

        }
    }

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

共有1个答案

章永安
2023-03-14

三种可能的解决方案(选择一种):

>

  • 从方法createLoginDialog中删除“静态”

    将“静态”添加到类MyDialog

    将类MyDialog移出类TryDialogBox

  •  类似资料:
    • 我尝试了很多我在网上看到的不同东西,但我什么都做不了。我只需要一个简单的对话框,当你点击菜单中的退出按钮并询问“您确定要退出吗?”并提供一个有效的“是的,我确定。”和“不,取消”按钮。

    • 我正在编写一个javafx程序,我需要创建和使用我自己的Stage based (Javafx。Stage)对话框,用于显示消息和确认。到目前为止,我已经编写了所有必要的代码,但是我有一个问题: 对话框必须停止执行其余代码,直到给出类似“是”或“否”或“重试”之类的响应。当我使用我的对话框,如“DialogBox.ShowMessage”时,会出现一个带有消息和按钮的阶段。但是,正如您可能认为的那

    • 我正在使用新的JavaFX Alert类(Java1.8_40),并尝试在exibition文本中使用HTML标记,但到目前为止还没有成功。下面是我正在尝试做的一个例子。 有没有人知道这是不是真的可能,给我举个例子? 提前道谢。

    • 问题内容: 我需要在JavaFX中创建一个对话框。我知道我可以通过修改模式,所有者和可调整大小的属性来使舞台表现得像对话框。 但是,如何从舞台窗口中隐藏“最小化”和“最大化”按钮?典型的对话框只有“关闭”按钮。 问题答案: 在Windows 7下,在显示窗口之前初始化为StageStyle.UTILITY将创建一个仅具有关闭按钮而没有最小化或最大化按钮的窗口: 如果您需要一整套基本的JavaFX对

    • 我需要用JavaFX创建一个对话框。我知道我可以通过修改modal、owner和resizable属性使Stage的行为像一个对话框。 但是我如何从舞台窗口隐藏“最小化”和“最大化”按钮呢?典型的对话框只有“关闭”按钮。

    • 我正在寻找一种方法来设置默认JavaFX对话框(。 我尝试获取对话框窗格并添加样式表,但它只覆盖了对话框的一小部分。我更喜欢只使用外部css文件进行样式设计,而不在代码上添加样式类。这看起来很混乱(标题、内容、内容上的自有内容等等) 我已经在谷歌上搜索了很多,只找到了ControctionFX的例子,但是由于jdk8_40 JavaFX有自己的Dialogs,我现在使用它们。 有什么建议吗? 编辑