【问题标题】:JFX: Lock a stage ontop of another stage / detect stage orderJFX:将一个阶段锁定在另一个阶段之上/检测阶段顺序
【发布时间】:2017-11-02 03:43:13
【问题描述】:

假设我有三个 Java FX 阶段:A、B 和 C。每个阶段都有自己的打开窗口,并针对以下行为:

如果 A 获得焦点,B 应该出现在 B 的顶部,C 应该出现在 B -> A-B-C

如果B在对焦,Be应该出现在C前面,A在后面-> A-C-B

如果 C 是焦点,自然是-> A-B-C

我知道toFront() 函数,并尝试通过简单地调用toFront() 来相应地手动执行顺序,只要其中一个阶段重新获得焦点,就可以按正确的顺序调用每个阶段,但这会导致不希望的闪烁,因为有显然无法确定哪些窗口已经在正确的位置。

很遗憾,我不能使用模态窗口系统,因为所有窗口都需要保持并行运行。

有什么办法可以做到吗?

提前非常感谢!

【问题讨论】:

    标签: javafx stage


    【解决方案1】:

    刚刚遇到同样的问题。 我能找到的唯一“hack”是存储阶段获得焦点的顺序,然后以相反的顺序遍历所有阶段并调用 .toFront()。

    每当一个阶段获得焦点时,我都会将其放在开放阶段列表的顶部。 然后我在全局范围内阻止 EventHandler,因为每次舞台收到 .toFont() 调用时,它也会获得焦点。

    在 Mac 上运行良好。 在 Windows 下不起作用并显示奇怪的行为

    this.model.stage.focusedProperty().addListener((ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) -> {
            if (!mainModel.blockFocusRequest){
            if (t1){
                try{
                    mainModel.openWindows.remove(this.model.stage);
                    mainModel.openWindows.add(0,this.model.stage);
                mainModel.blockFocusRequest = true;
                for (int i=mainModel.openWindows.size()-1;i>=0;i--){
                    mainModel.openWindows.get(i).toFront();
                }                              
                } finally{
                    mainModel.blockFocusRequest = false;
                }
            }
            }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 2020-04-07
      • 2022-11-14
      • 2020-05-29
      • 1970-01-01
      相关资源
      最近更新 更多