2016-08-30 7 views
2

NullPointerException私のアプリケーションでは、特定のPCでのみ発生し、再現性があります。 Javafxを使ってSwingNode経由でSwing JPanelsを使ってGUIを書いた。スイングで `NullPointerException` AWTスレッド - JLightweightFrameでのカーソルの更新

どうすればよいですか?

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) 
+3

まず、SwingイベントスレッドでGUIを起動していることを確認してください。 –

+2

@HovercraftFullOfEels OPはこう言っています:* "SwingNode経由でJavafxを使ってSwing JPanelsを使ってGUIを書いた。そのため、FXアプリケーションスレッドではGUIを*起動する必要がありますが、SwingNodeコンテンツの作成はAWTイベントディスパッチスレッドに委譲されます。これは少なくともスタックトレースから起きているようです。実際のコードがなければ、確かに知るのは難しいです。 (私は今日、奇妙な気分になっていると思います...) –

+0

@James_D:明確化のためにありがとう –

答えて

1

問題についての詳細:

はどうやら、これはJDK自体(バージョン8および9)でのバグで、おそらくJDK10まで固定されません。

この例外はupdateClientCursor機能(行472から749)で、sun.swing.JLightweightFrame.javaクラス内からスローされます。あなたが移動するとMouseInfo.getPointerInfo()は、例えば、NULLを返すことができるので、これが起こっている、一般的に

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を戻すことができます。このシナリオでは、この行にNull Pointer Exceptionがあります。MouseInfo.getPointerInfo().getLocation()は、NULLオブジェクトのメソッドを実行しようとしています。

マルチスクリーンマシンのモニタ間でJavaFXアプリケーションウィンドウを移動すると、私にとってはNPEがスローされます。それは毎回起こっていませんが、非常に簡単に再現可能です。 私はSwingコンポーネントをJavaFX SwingNodeコンポーネントで使用しています。

このバグはすでにOracleバグリストにa known issueです。

コードの修正: このスニペットは、このバグのためのオプションの修正を示しています

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

オプションソリューション:

それが正式なオラクルをwithingバグがあるので、 JDK、それについて私ができることはあまりありません。修正を適用したOpenJDKのような他の非正式なJDKに適用されている修正がありますが、どのバージョンでこの修正がまだ適用されるか分かりません。

私にとっては、自分のJDKを適用した修正でコンパイルして使用しようとしていて、それをプロジェクトで使用しようとしていますが、これは維持するのが難しく、誰かが別の修正/回避策を持っているなら、私は聞いて喜んでいるでしょう。

関連する問題