我的应用程序适用于平板电脑(使用Windows 7),有时会关闭其显示屏以节省电池电量。触摸屏幕后,它会再次打开。
即使关闭屏幕,应用程序仍应保持运行,一般来说,即完成(即播放声音)。唯一的问题是,当屏幕关闭并且应用程序尝试向场景中添加新组件时(技术上 - 将子项添加到显示的GridPane
),当我触摸屏幕时,新添加的组件不可见(并且它打开)。
就像有一个缓存可以在屏幕打开/关闭时存储和恢复显示的内容。打开屏幕后 - 当我单击Windows按钮(键盘)或将焦点更改为另一个应用程序时 - 会出现新添加的组件。
我已尝试设置-Dprism.dirtyopts=false
,但它没有改变任何内容。
我的Java是7u67。
它知道bug吗?有任何编程方法吗?我已经考虑过使用WinAPI来强制重绘/刷新应用程序窗口,但对于这种情况来说它似乎太大了。
答案 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);
}
它要求您在依赖项中包含jna
和jna-platform
。
当屏幕关闭时,应该在绘图后调用此方法(如何检测它是另一个问题)。由于我的应用程序很少自动绘制(没有用户输入),所以在每次绘图自动发生后我都会调用它。
适用于Win7。