首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaFX警报不是在新窗口中打开,而是在新选项卡中打开

JavaFX警报不是在新窗口中打开,而是在新选项卡中打开
EN

Stack Overflow用户
提问于 2018-10-09 13:27:19
回答 2查看 1.1K关注 0票数 2

我正在使用带有场景生成器的JavaFX 8,并且我正在尝试创建一个警报弹出窗口。请看下面的代码:

更新:包括我拥有的所有代码(不包括一些个人标识符)。

代码语言:javascript
复制
public class MainViewController {

    @FXML
    private void handleQuitButtonAction(ActionEvent event) {
        System.exit(0);
    }

    @FXML
    private void handleImportButtonAction(ActionEvent event) {
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("Select the file to import");
        File file = fileChooser.showOpenDialog(new Stage());
        Alert alert;
        if (FileAccess.importFile(file)) {
            alert = new Alert(AlertType.INFORMATION);
            alert.setTitle("Success!");
            alert.setHeaderText("Congrats!");
            alert.setContentText("Successfully imported data from the chosen file!");
        } else {
            alert = new Alert(AlertType.ERROR);
            alert.setTitle("Error!");
            alert.setHeaderText("Sorry...");
            alert.setContentText("Something wrong with the import, please try again.");
        }
        alert.showAndWait();

        // Refresh Scroll List
    }

    @FXML
    private void handleExportButtonAction(ActionEvent event) {
    }
}

代码语言:javascript
复制
public class MainApp extends Application {

    private Stage primaryStage;
    private BorderPane mainView;

    @Override
    public void start(Stage primaryStage) {
        this.primaryStage = primaryStage;
        this.primaryStage.setTitle("Main System");
        showMainView();
    }

    private void showMainView() {
        try {
            // Load Main View from FXML file.
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(MainApp.class.getResource("view/MainView.fxml"));
            mainView = (BorderPane) loader.load();

            // Show the scene containing the root layout.
            Scene scene = new Scene(mainView);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Stage getPrimaryStage() {
        return primaryStage;
    }

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

代码语言:javascript
复制
public class FileAccess {

    public static boolean importFile(File file) {
        return false;
    }
}

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
  <?import javafx.scene.control.Button?>
    <?import javafx.scene.control.ButtonBar?>
      <?import javafx.scene.control.ScrollPane?>
        <?import javafx.scene.effect.DropShadow?>
          <?import javafx.scene.layout.BorderPane?>

            <BorderPane prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="view.MainViewController">
              <center>
                <ScrollPane prefWidth="800.0" BorderPane.alignment="CENTER" />
              </center>
              <top>
                <ButtonBar prefHeight="40.0" prefWidth="200.0" BorderPane.alignment="CENTER">
                  <buttons>
                    <Button focusTraversable="false" mnemonicParsing="false" onAction="#handleImportButtonAction" text="Import" ButtonBar.buttonData="LEFT" />
                    <Button focusTraversable="false" mnemonicParsing="false" onAction="#handleExportButtonAction" text="Export" ButtonBar.buttonData="LEFT" />
                    <Button focusTraversable="false" mnemonicParsing="false" onAction="#handleQuitButtonAction" text="Quit Program" ButtonBar.buttonData="RIGHT" />
                  </buttons>
                  <effect>
                    <DropShadow />
                  </effect>
                  <BorderPane.margin>
                    <Insets left="10.0" right="10.0" />
                  </BorderPane.margin>
                </ButtonBar>
              </top>
            </BorderPane>

但是,它不是打开一个新窗口,而是在一个新选项卡中打开警报(我没有设置任何与选项卡相关的内容),请参见以下屏幕截图:

它的大小甚至不正确...

我使用的是macOS Mojave。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2018-10-09 19:19:22

我认为你不应该创建一个新的stage对象。这可能就是问题所在。

代码语言:javascript
复制
Stage stage = (Stage)((Node)(event).getSource()).getScene().getWindow();

上面的代码将为您提供当前阶段。这可能会解决您的问题。

祝好运

票数 0
EN

Stack Overflow用户

发布于 2021-12-15 11:35:14

@Jing解决方案运行良好,但如果您不想强制您的用户修改其操作系统设置,则需要为JavaFX警报或任何对话框组件分配一个父组件。警报扩展对话框。

代码语言:javascript
复制
private void setDefaultOwnerIfNotExisting(Dialog<?> dialog, Window parent)         {
    if (dialog.getOwner() == null) {
        dialog.initOwner(parent);
    }
}

这已经在MacOS蒙特里测试过了,现在我的提醒不再是新的标签了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52713897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档