JavaFX - 屏幕关闭时的绘图组件

时间:2014-12-04 11:28:31

标签: java windows winapi javafx javafx-2

我的应用程序适用于平板电脑(使用Windows 7),有时会关闭其显示屏以节省电池电量。触摸屏幕后,它会再次打开。

即使关闭屏幕,应用程序仍应保持运行,一般来说,即完成(即播放声音)。唯一的问题是,当屏幕关闭并且应用程序尝试向场景中添加新组件时(技术上 - 将子项添加到显示的GridPane),当我触摸屏幕时,新添加的组件不可见(并且它打开)。

就像有一个缓存可以在屏幕打开/关闭时存储和恢复显示的内容。打开屏幕后 - 当我单击Windows按钮(键盘)或将焦点更改为另一个应用程序时 - 会出现新添加的组件。

我已尝试设置-Dprism.dirtyopts=false,但它没有改变任何内容。

我的Java是7u67。

它知道bug吗?有任何编程方法吗?我已经考虑过使用WinAPI来强制重绘/刷新应用程序窗口,但对于这种情况来说它似乎太大了。

1 个答案:

答案 0 :(得分:0)

我刚刚想出了“简单”的解决方法:

import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.ptr.IntByReference;

/** WINAPI CONSTANTS **/
private static final int RDW_UPDATENOW = 0x0100;

/**
* Redraws all windows associated with currently running process.
*/
public static void redrawApplicationWindows() {
    final int processId = Kernel32.INSTANCE.GetCurrentProcessId();
    User32.INSTANCE.EnumWindows(
        new WinUser.WNDENUMPROC() {
          @Override
          public boolean callback(WinDef.HWND hwnd, Pointer pointer) {
            IntByReference someProcessId = new IntByReference();
            User32.INSTANCE.GetWindowThreadProcessId(hwnd, someProcessId);
            if (someProcessId.getValue() == processId) {
              User32.INSTANCE.RedrawWindow(hwnd, null, null, new User32.DWORD(RDW_UPDATENOW));
            }
            return true;
          }
        }, Pointer.NULL);
}

它要求您在依赖项中包含jnajna-platform

当屏幕关闭时,应该在绘图后调用此方法(如何检测它是另一个问题)。由于我的应用程序很少自动绘制(没有用户输入),所以在每次绘图自动发生后我都会调用它。

适用于Win7。