当前位置: 首页 > 知识库问答 >
问题:

JavaFX最小化

寿丰
2023-03-14

我在这个问题上使用了公认的答案:JavaFX最小化未装饰阶段,以适当地最小化我的应用程序。

然而,不幸的是,默认窗口最小化了

我知道可以在未装饰的窗口中显示动画,因为我有一个应用程序具有这种行为(PotPlayer)。

如何使用JNA制作动画?

编辑:这是一个可以正常最小化JavaFX窗口的Kotlin代码段,还添加了bounty。

fun makeMinimizable(stage: Stage) {
         val user32 = User32.INSTANCE
         val hWnd = user32.FindWindow(null, stage.title)
         val oldStyle = user32.GetWindowLong(hWnd, WinUser.GWL_STYLE)
         val newStyle = oldStyle or 0x00020000 // WS_MINIMIZEBOX
         user32.SetWindowLong(hWnd, WinUser.GWL_STYLE, newStyle)
    }

共有1个答案

齐元章
2023-03-14

在对Windows动画进行进一步研究后,似乎有一种解决方案可以被黑客攻击在一起。这似乎更像是一个操作系统问题,而不仅仅是JavaFX。

通过在start()中修改,我可以使初始窗口保持未装饰状态,同时最小化和使用动画:

    int newStyle = oldStyle | 0x00020000 | 0x00C00000;

但是,在最小化并重新打开后,Windows边框看起来很奇怪。

然后,我尝试使用ChangeListener在图标化时交换窗口样式。

stage.iconifiedProperty().addListener(new ChangeListener<Boolean>() {

        @Override
        public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) {
            if (t1.booleanValue() == true) {
                int newStyle = oldStyle | 0x00020000 | 0x00C00000;
                user32.SetWindowLong(hwnd, GWL_STYLE, newStyle);
            } else if (t1.booleanValue() == false) {
                int newStyle = oldStyle | 0x00020000;
                user32.SetWindowLong(hwnd, GWL_STYLE, newStyle);
            }
        }
    });

这成功地让窗口非最小化动画一致地正常工作,同时使(可见的)舞台无边框。

一旦我找到了重新应用的最佳方法,我似乎可以使最小化动画生效:

java prettyprint-override">    int newStyle = oldStyle | 0x00020000 | 0x00C00000;
    user32.SetWindowLong(hwnd, GWL_STYLE, newStyle);

就在舞台图标化之前,用户看不到边框。一旦实现,这可能与下面第一个链接中的C解决方案类似。基本上,上面的ChangeListener做的事情是相反的。

我认为我们需要另一个线程在后台监听以完成此解决方案,等待图标化事件发生。我认为是舞台。isIconified()==false应该是事件被触发的情况,然后我们在后台线程中执行必要的任务来设置上述代码。然后,当取消最小化时,(…有些工作)changeListener会将其重置为无动画的无框窗口,直到再次最小化。

有一个小错误,第一个un-minimize显示了我的舞台的底部部分,经过了一点裁剪和复制,但在后续操作后它消失了。我们可能需要尝试将第二个十六进制更改为触发动画的其他内容,并在ChangeListener之外和另一个线程中设置所有内容。

我计划很快在我自己的外汇项目中完成这项工作。我还是个学生,所以我对多线程和服务不是很有经验,但我对如何进行这项工作有很好的想法,只需要几小时的黑客攻击。

如果您在此期间有任何进展,请告诉我!这是一个很好的起点。还没有人用Java解决这个问题。我读了一些讨论,说像Steam这样的无边界程序已经做到了这一点,但我认为没有人能够完全理解他们是如何做到的,我怀疑这是通过下面的C#hack实现的。但是,这对于我们的目的来说已经足够好了。

解决无边界/未装饰动画的链接:

https://stackoverflow.com/a/31489766/7234125

^我们需要实现这个答案,选项1,从C到Java

使用Areo捕捉、阴影、最小化动画和抖动的无边界窗口

http://pinvoke.net/default.aspx/Constants/Window样式。html

 类似资料:
  • 这听起来可能像是JavaFX ImageView设置的最大大小的重复,但它是不同的。 我想限制ImageView的最大大小。不幸的是,设置ImageView大小的唯一方法似乎是fitWidth和fitHeight,但是如果图像小于配合值,则会放大图像。 我尝试将fitWidth/fitHeight设置为0/0,并将ImageView包装到设置了maxWidth的窗格中-没有成功(图像以原始大小显示

  • 我是Javafx新手,我正在从事Javafx项目。我想最小化javafx窗口。我使用初级阶段。initStyle(舞台风格。未装饰)。我还想将clickevent添加到fxml中的imageview中。

  • 我在JavaFX应用程序中有一个未修饰的阶段。为了最小化它,我需要一个最小化按钮。我在中创建了我的布局,其中有一个,但是当我尝试使用最小化位于控制器内部的这个按钮时,使用,它找不到阶段。 如何在控制器类中找到对该阶段的引用?

  • 我有一个未装饰的JavaFX舞台,我自己的最小化,最大化 有没有办法通过单击任务栏图标来最小化纯Java代码未修饰的阶段?如果不是的话,我该怎么做,比如说,JNA? 编辑:好的,我一直在尝试用JNA解决这个问题,但由于几乎没有C/C/JNA,我在设置这个方面有点麻烦。如果有人帮我把这些东西拼凑起来,我将不胜感激。。 到目前为止,这是我的代码: 编辑2:我最终在这一点上做得更进一步,但当我重新设置W

  • 问题内容: 我有一个未经修饰的JavaFX Stage,还有我自己的最小化,最大化和关闭按钮。但不幸的是,与经过修饰的行为相比,在Windows 7中单击任务栏图标不会自动最小化该阶段。 通过单击任务栏图标,是否可以通过纯Java代码最小化未修饰的阶段?如果不是,我该如何使用JNA? 编辑: 好的,我一直在尝试使用JNA解决此问题,但是几乎没有C / C ++ / JNA完成,因此设置起来有些麻烦

  • 给定一个正整数的矩阵(非正方形),其中同一行上的所有元素都是可置换的,问题是最小化列的最大和和最小和之间的差异。 例如 答案是2。 我试着天真地对它进行分类(合并)