gpt4 book ai didi

java - `NullPointerException` on swing AWT 线程 - JLightweightFrame 上的游标更新

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:52:47 24 4
gpt4 key购买 nike

我的应用程序中有一个 NullPointerException,它只发生在一台特定的 PC 上,并且是可重现的。我使用 Javafx 编写了我的 GUI,并通过 SwingNode 在其上添加了一些 Swing JPanel。

我该怎么办?

Exception-Time = 2016-08-30 06:55:50  UTC Exception-Tag = 0 Exception-Message = Thread AWT-EventQueue-0 (Id = 55) throw exception: null Stack-Trace = java.lang.NullPointerException
at sun.swing.JLightweightFrame.updateClientCursor(Unknown Source)
at sun.swing.JLightweightFrame.access$000(Unknown Source)
at sun.swing.JLightweightFrame$1.updateCursor(Unknown Source)
at sun.awt.windows.WLightweightFramePeer.updateCursorImmediately(Unknown Source)
at java.awt.Component.updateCursorImmediately(Unknown Source)
at java.awt.Container.validate(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

最佳答案

有关问题的更多信息:

显然,这是 JDK 本身(版本 8 和 9)的错误,可能要到 JDK10 才能修复。

此异常是从 sun.swing.JLightweightFrame.java 类中的 updateClientCursor 函数中抛出的(第 472-749 行):

private void updateClientCursor() {
Point p = MouseInfo.getPointerInfo().getLocation();
SwingUtilities.convertPointFromScreen(p, this);
Component target = SwingUtilities.getDeepestComponentAt(this, p.x, p.y);
if (target != null) {
content.setCursor(target.getCursor());
}
}

通常,发生这种情况是因为 MouseInfo.getPointerInfo() 可以返回 NULL,例如,当您在图形设备之间移动时。 'MouseInfo' 仍然可以保存以前的图形设备信息,如果鼠标已经移动到新的图形设备并且 MouseInfo 仍然没有更新,则 getPointerInfo() 可以返回 NULL到新的图形设备信息。这种情况将在 MouseInfo.getPointerInfo().getLocation() 行上导致 Null Pointer Exception 以尝试运行 NULL 对象的方法。

对我来说,当我在我的多屏机器上的显示器之间移动我的 JavaFX 应用程序窗口时,会抛出 NPE。它不是每次都发生,但它很容易重现。我在 JavaFX SwingNode 组件中使用 Swing 组件。

这个错误已经是a known issue在 Oracle 错误列表中。

代码修复:此代码段显示了此错误的可选修复:

private void updateClientCursor() {
PointerInfo pointerInfo = MouseInfo.getPointerInfo();
if (pointerInfo == null) {
/*
* This can happen when JavaFX cannot decide
* which graphics device contains the current
* mouse position.
*/
return;
}
Point p = pointerInfo.getLocation();
SwingUtilities.convertPointFromScreen(p, this);
Component target = SwingUtilities.getDeepestComponentAt(this, p.x, p.y);
if (target != null) {
content.setCursor(target.getCursor());
}
}

Taken from JetBrains repository

可选解决方案:

因为这是正式 Oracle JDK 的一个错误,我对此无能为力。在其他非正式 JDK 中应用了修复程序,例如 OpenJDK例如,它应用了一个修复,但我还不知道哪个版本会应用这个修复。

对我来说,我可能会尝试编译并使用我自己的 JDK 和应用的修复程序,并在我的项目中使用它,但这是一个难以维护且不太灵活的解决方案。如果有人有其他修复/解决方法,我会很高兴听到。

关于java - `NullPointerException` on swing AWT 线程 - JLightweightFrame 上的游标更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39227647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com