【问题标题】:JavaFX - Drawing component when the screen is turned offJavaFX - 屏幕关闭时的绘图组件
【发布时间】:2014-12-04 11:28:31
【问题描述】:

我的应用程序可在平板电脑(使用 Windows 7)上运行,该平板电脑有时会关闭显示器以节省电池电量。触摸屏幕后,它会再次亮起。

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

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

我尝试设置-Dprism.dirtyopts=false,但没有改变任何东西。

我的 Java 是 7u67。

这是已知的错误吗?是否有任何编程解决方法?我曾考虑使用 WinAPI 强制重绘/刷新应用程序窗口,但对于这种情况来说似乎太大了。

【问题讨论】:

  • 尝试在 javafx-jira 中提交错误。你很快就会在那里得到答案。但是,您也可以尝试 javafx-8 来检查它是否已修复。如果已修复 - 尝试在 javafx-jira 中查找内容

标签: java windows winapi javafx javafx-2


【解决方案1】:

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

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 中运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2010-09-28
    • 1970-01-01
    相关资源
    最近更新 更多