[英]OnPause return NullPointerException when screen is turned off
[英]JavaFX - Drawing component when the screen is turned off
我的应用程序可在平板电脑(使用Windows 7)上工作,有时会关闭其显示屏以节省电池。 触摸屏幕后,它会再次打开。
通常,即使关闭屏幕后,应用程序也应保持可操作状态,即完成操作(即播放声音)。 唯一的问题是,当屏幕关闭并且应用程序尝试将新组件添加到场景中时(从技术上讲-将子级添加到显示的GridPane
),当我触摸屏幕时,新添加的组件不可见(然后打开) )。
就像有一个缓存可以在屏幕打开/关闭时存储和还原显示的内容。 打开屏幕后-当我单击Windows按钮(键盘)或将焦点更改到另一个应用程序时-会出现新添加的组件。
我尝试设置-Dprism.dirtyopts=false
但它没有任何改变。
我的Java是7u67。
它是已知的错误吗? 有什么编程解决方法? 我对使用WinAPI强制重新绘制/刷新应用程序窗口有一定的了解,但在这种情况下似乎太大了。
我刚刚想出了“简单”的解决方法:
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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.