2016-04-14 43 views
3

Java uygulamamız çalışırken Windows 7'deki Windows Teması (right-click Desktop > Personalize aracılığıyla) değiştirirken bir istisna alıyoruz. İnternette arama yapmak bazı sonuçlar doğurdu, ancak çoğunlukla daha önce çözüldüğünü iddia eden java hata raporlarıyla ilgili."java.lang.InternalError: HTHEME is null" isteğe bağlı JRE'lerde (Windows)

java.lang.InternalError: HTHEME is null 
    at sun.awt.windows.ThemeReader.paintBackground(Native Method) 
    at sun.awt.windows.ThemeReader.paintBackground(Unknown Source) 
    at com.sun.java.swing.plaf.windows.XPStyle$SkinPainter.paintToImage(Unknown Source) 
    at sun.swing.CachedPainter.paint0(Unknown Source) 
    at sun.swing.CachedPainter.paint(Unknown Source) 
    at com.sun.java.swing.plaf.windows.XPStyle$Skin.paintSkinRaw(Unknown Source) 
    at com.sun.java.swing.plaf.windows.AnimationController.paintSkin(Unknown Source) 
    at com.sun.java.swing.plaf.windows.XPStyle$Skin.paintSkin(Unknown Source) 
    at com.sun.java.swing.plaf.windows.XPStyle$Skin.paintSkin(Unknown Source) 
    at com.sun.java.swing.plaf.windows.WindowsScrollBarUI.paintThumb(Unknown Source) 
    at javax.swing.plaf.basic.BasicScrollBarUI.paint(Unknown Source) 
    at javax.swing.plaf.ComponentUI.update(Unknown Source) 
    at javax.swing.JComponent.paintComponent(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JLayeredPane.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paintToOffscreen(Unknown Source) 
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source) 
    at javax.swing.RepaintManager$PaintManager.paint(Unknown Source) 
    at javax.swing.RepaintManager.paint(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source) 
    at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source) 
    at sun.awt.SunGraphicsCallback.runComponents(Unknown Source) 
    at java.awt.Container.paint(Unknown Source) 
    at java.awt.Window.paint(Unknown Source) 
    at javax.swing.RepaintManager$4.run(Unknown Source) 
    at javax.swing.RepaintManager$4.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
    at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source) 
    at javax.swing.RepaintManager.access$1200(Unknown Source) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source) 
    at java.awt.event.InvocationEvent.dispatch(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.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.WaitDispatchSupport$2.run(Unknown Source) 
    at java.awt.WaitDispatchSupport$4.run(Unknown Source) 
    at java.awt.WaitDispatchSupport$4.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.awt.WaitDispatchSupport.enter(Unknown Source) 
    at java.awt.Dialog.show(Unknown Source) 
    at java.awt.Component.show(Unknown Source) 
    at java.awt.Component.setVisible(Unknown Source) 
    at java.awt.Window.setVisible(Unknown Source) 
    at java.awt.Dialog.setVisible(Unknown Source) 
    at com.example.App$130$1.run(Unknown Source) 
    at java.awt.event.InvocationEvent.dispatch(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.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.WaitDispatchSupport$2.run(Unknown Source) 
    at java.awt.WaitDispatchSupport$4.run(Unknown Source) 
    at java.awt.WaitDispatchSupport$4.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.awt.WaitDispatchSupport.enter(Unknown Source) 
    ... goes on and on 

LAF ile ilişkili gibi görünmektedir: Bu kesilmiş ve kısmen gizlenmiş yığın izidir. Uygulama , başlatıldıktan sonra LAF'yi değiştirmeyi desteklemez. Ancak, başlangıçta

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 

'u arar. Bu, bir Windows 7 Enterprise x64 makinesinde, 1.8.0_74 64bit'ı rasgele bir JRE sürümü çalıştırarak gerçekleşir. This, oldukça benzer ve varsayılan olarak çözündüğü varsayılan bir Java hata raporu örneğidir.

Neden birinin neden olabileceğine ve nasıl çalışılabileceğine biraz ışık tutabiliyorsunuz (açık olan "Windows'un görünüşünü ve görünüşünü ayarlama")?

P.S. .: bağlantılı hata raporu istemlerde bir yorum: SwingSet3 bir JTable gösteren iken

A good application to reproduce the issue is SwingSet3 (https://java.net/projects/Swingset3).

Change Look-and-Feel to Windows, and click JInternalFrame in the list of components on the left. Create several more internal frames. Try switching Windows themes: Windows 7 Basic ??? Windows Classic.

ama biz, sadece bizim için tek bir zaman oldu yapıyor hiç şans vardı.

Düzenleme: Bu, Windows Teması değiştiğinde gerçekleşir - ister elle ister, isterse kullanıcı, Java uygulamasını çalıştıran makineye Uzak Masaüstü aracılığıyla oturum açtığında. Daha duyarlı bir arabirim sağlamak için, Aero devre dışı bırakılabilir ve Windows Klasik tabanlı temasa geçme otomatik olarak yapılabilir. Soruyu buna göre düzenledim.

cevap

1

Bunun etrafındaki tek yol, kullanıcının yüzüne atmak yerine bu özel durumun göz ardı edilmesidir. Bu tam olarak yaptığımız şeydir. Boyama sırasında gerçekleştiği için, büyük bir zarar yok ve uygulama sadece iyi durumda kalıyor (en azından test sırasında). Muhtemelen kimse bunu düzeltmeyi umursamamanın sebebidir (Swing'in zamanla yavaşça ölmesi yanında).

HTHEME is null istisnası alırsanız ve yığın izlemesi bir tablo üstbilgi oluşturucusundan bahsediyorsa, varsayılanı saran özel bir oluşturucu kullanıyorsanız, this answer'u okuyun. Bunun uygun bir çözümü var.