首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX极小化&用动画使未装饰的舞台最大化

JavaFX极小化&用动画使未装饰的舞台最大化
EN

Stack Overflow用户
提问于 2018-06-24 09:09:43
回答 1查看 1.2K关注 0票数 6

在这个问题中,我使用了公认的答案:JavaFX Minimizing Undecorated Stage,以适当地最小化我的应用程序。

然而,不幸的是,默认的Windows最小化和最大化动画根本没有显示(该窗口只是出现和消失)。

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

我怎样才能使动画出现与JNA?

编辑:这里有一个有效的Kotlin代码片段,可以适当地最小化JavaFX窗口,还增加了赏金。

代码语言:javascript
复制
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)
    }
EN

回答 1

Stack Overflow用户

发布于 2020-01-16 20:35:49

根据对Windows动画的进一步研究,它看起来像是一个解决方案可以一起被黑。这似乎更多的是一个操作系统问题,而不仅仅是JavaFX。

通过在start()中修改以下内容,我能够使初始窗口保持未修饰,同时最小化动画:

代码语言:javascript
复制
    int newStyle = oldStyle | 0x00020000 | 0x00C00000;

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

然后,我试图在图标化时使用ChangeListener来交换Windows样式。

代码语言:javascript
复制
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);
            }
        }
    });

这成功地使窗口不最小化动画工作一致良好,同时保持(可见的)阶段无边界。

看来,一旦我找到了重新应用的最佳方法,就可以使动画最小化:

代码语言:javascript
复制
    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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51008461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档