在这个问题中,我使用了公认的答案:JavaFX Minimizing Undecorated Stage,以适当地最小化我的应用程序。
然而,不幸的是,默认的Windows最小化和最大化动画根本没有显示(该窗口只是出现和消失)。
我知道可以用未装饰的窗口显示动画,因为我有一个具有此行为的应用程序(PotPlayer)。
我怎样才能使动画出现与JNA?
编辑:这里有一个有效的Kotlin代码片段,可以适当地最小化JavaFX窗口,还增加了赏金。
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)
}发布于 2020-01-16 20:35:49
根据对Windows动画的进一步研究,它看起来像是一个解决方案可以一起被黑。这似乎更多的是一个操作系统问题,而不仅仅是JavaFX。
通过在start()中修改以下内容,我能够使初始窗口保持未修饰,同时最小化动画:
int newStyle = oldStyle | 0x00020000 | 0x00C00000;但是,在最小化并重新打开之后,Windows边框看起来很奇怪。
然后,我试图在图标化时使用ChangeListener来交换Windows样式。
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);
}
}
});这成功地使窗口不最小化动画工作一致良好,同时保持(可见的)阶段无边界。
看来,一旦我找到了重新应用的最佳方法,就可以使动画最小化:
int newStyle = oldStyle | 0x00020000 | 0x00C00000;
user32.SetWindowLong(hwnd, GWL_STYLE, newStyle);就在舞台被偶像化之前,边界对用户来说是不可见的。一旦实现,这可能与下面第一个链接中的C#解决方案类似。基本上,上面的ChangeListener所做的是相反的。
我认为,我们需要另一个线程在后台监听,以完成这个解决方案,等待图标化事件的发生。我认为当事件被触发时,stage.isIconified() == false应该是这样,然后在后台线程中执行必要的任务来设置上面的代码。然后,(...somewhat working) changeListener会将其重新设置到没有动画的无框窗口,直到它再次最小化为止。
有一个小的错误,第一个un-最小化显示我的阶段的底部部分剪裁和复制一点点,但它消失后,后续的行动。我们可能需要尝试将第二个十六进制更改为触发动画的其他内容,并在ChangeListener之外和另一个线程中设置所有内容。
我计划很快在我自己的fx程序中完成这个项目。我仍然是一名学生,所以我对多线程和服务没有太大的经验,但我有一个很好的想法如何去做,它将只需要几个小时的黑客入侵。
如果你在此期间有任何进展,请告诉我!这是一个很好的起点。还没有人用Java解决过这个问题。我读到了一些讨论,像蒸汽这样的无边界程序已经做到了这一点,但我不认为任何人都能完全搞清楚他们是如何做到的,我怀疑这是通过下面的C#黑客。但是,这对我们的目的来说已经足够了。
与解决无边界/未修饰动画有关的链接:
https://stackoverflow.com/a/31489766/7234125
^我们需要实现这个答案,选项1,从C#到Java
Borderless Window Using Areo Snap, Shadow, Minimize Animation, and Shake
http://pinvoke.net/default.aspx/Constants/Window%20styles.html
https://stackoverflow.com/questions/51008461
复制相似问题