gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:22:15 26 4
gpt4 key购买 nike

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

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

最佳答案

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

stage.setMaximized(true);

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

  • 操作系统:GNU/Linux
  • 发行版:Manjaro
  • Linux 核心:5.3.6-1
  • DE:侏儒。
  • Java 版本:OpenJDK 12.0.1
  • JavaFX 版本:OpenJFX 12.0.1(gluon 版本)。

更新:官方文档指出:

Note that showing a modal stage does not necessarily block the caller.

因此,我决定使用 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窗口,但用户无法与其节点交互。

关于java - 具有模态的舞台隐藏最大化按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58167722/

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