为了账号安全,请及时绑定邮箱和手机立即绑定

具有模态的舞台隐藏最大化按钮

具有模态的舞台隐藏最大化按钮

杨__羊羊 2023-09-13 15:23:18
当我设置舞台的模式时,它会隐藏最大化按钮Stage stage = new Stage();stage.setScene(new Scene((Parent) controller.getViewNode()));stage.initStyle(StageStyle.DECORATED);stage.setResizable(true);stage.setIconified(false);stage.initModality(Modality.APPLICATION_MODAL);stage.initOwner(window);所以我希望舞台是一个模态,但也显示最大化按钮,但不会发生什么。顺便说一句,我正在使用 Ubuntu。我已经进行了搜索,但我只找到了如何删除最大化按钮
查看完整描述

1 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

我也遇到同样的情况。如果我尝试最大化使用

stage.setMaximized(true);

它不起作用,最大化按钮也不显示。我正在研究这个问题,但根本没有答案。这是我在这里发现的第一个类似问题。我在用着:

  • 操作系统:GNU/Linux

  • 发行版:Manjaro

  • Linux 核心:5.3.6-1

  • 来自:侏儒。

  • Java版本:OpenJDK 12.0.1

  • JavaFX 版本:OpenJFX 12.0.1(胶子构建)。

更新:官方文档指出:

请注意,显示模态阶段并不一定会阻止调用者。

因此,我决定使用 EventHandler 来解决该问题。我创建了一个实用程序类来处理这个问题。

import javafx.event.Event;

import javafx.stage.Stage;

import javafx.stage.WindowEvent;


/**

 * This is a utility class to create a Widow Event handler

 * in such way that when a child window shows, a parent (owner)

 * stage get locked; and when the child window hides, the parent

 * stage get unlocked.

 *

 * @author David Vidal

 * @version 1.0

 * @since 1.0

 */

public final class WindowsModality {

    /*=================*

     * Private fields. *

     *=================*/

    /**

     * The parent stage.

     */

    private final Stage owner;


    /*===============*

     * Constructors. *

     *===============*/


    /**

     * Initialize an instance with given parameters.

     *

     * @param owner parent stage.

     * @param child child stage.

     */

    public WindowsModality(Stage owner, Stage child) {

        this.owner = owner;

        child.addEventHandler(WindowEvent.WINDOW_HIDDEN, this::childHidden);

        child.addEventHandler(WindowEvent.WINDOW_SHOWN, this::childShown);

    }


    /*==================*

     * Implementations. *

     *==================*/


    /**

     * Implementation of functional interface EventHandler,

     * used to know when the child window is closed/hidden.

     *

     * @param event from {@link javafx.event.EventHandler#handle(Event)}

     */

    private void childHidden(WindowEvent event) {

        if (!event.isConsumed()) {

            owner.getScene().getRoot().setDisable(false);

        }

    }


    /**

     * Implementation of functional interface EventHandler,

     * used to know when the child window is shown.

     *

     * @param event from {@link javafx.event.EventHandler#handle(Event)}

     */

    private void childShown(WindowEvent event) {

        if (!event.isConsumed()) {

            owner.getScene().getRoot().setDisable(true);

        }

    }

}

然后,我刚刚添加了以下代码:


public void showAnotherStage(){

    //(Create and setup the new stage and scene)

    

    new WindowModality(primaryStage, newStage);

    newStage.show();

    

    //Do something else.

}

这是我的解决方案,经过测试并且工作正常。当显示子窗口(newStage)时,所有者(primaryStage)将被禁用,因此尽管用户可以激活primaryStage窗口,但用户无法与其节点交互。


查看完整回答
反对 回复 2023-09-13
  • 1 回答
  • 0 关注
  • 64 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信