java - 带有模态的舞台隐藏最大化按钮
问题描述
当我设置阶段的模式时,它隐藏了最大化按钮
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(胶子构建)。
更新:官方文档指出:
请注意,显示模态阶段并不一定会阻止调用者。
所以,我决定使用 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 窗口,但用户无法与其节点交互。
推荐阅读
- jquery - JQuery DatePicker 错位问题
- oauth-2.0 - 用于从 oauth URI 读取授权代码的环回接口重定向示例
- latex - 在 gnuplot 中生成的 epslatex 图像,如何在乳胶中显示时更改所有字体大小
- reactjs - 是否存在不允许在 return 语句后使用圆括号的 linting 规则
- html - 在选择中删除焦点选项周围的虚线边框
- firefox - 为什么将过期标头响应设置为 max-age=0 的未来日期?
- jquery - Fabric.js dbclick 事件子元素
- instagram - 如何从 29/6/2020 更新中获取 instagram id
- docker - 尝试在 Docker 上设置 dev vue 服务器时出现“quasar”错误
- sql - 即使更新了一个子行,如何从子表中获取所有行?