首页 > 解决方案 > 带有模态的舞台隐藏最大化按钮

问题描述

当我设置阶段的模式时,它隐藏了最大化按钮

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。我已经进行了搜索,但我只找到了如何删除最大化按钮

标签: javajavafx

解决方案


同样的事情发生在我身上。如果我尝试最大化使用

stage.setMaximized(true);

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

  • 操作系统:GNU/Linux
  • 发行版:Manjaro
  • Linux 核心:5.3.6-1
  • DE:侏儒。
  • 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 窗口,但用户无法与其节点交互。


推荐阅读