2013-03-21 35 views
6

Tôi đang sử dụng giao diện Nimbus & cảm thấy trong ứng dụng xoay của mình.

Đôi khi, khi một hộp thoại được thể hiện (với dialog.setVisible (true)) các Nimbus nhìn & cảm giác ném ngoại lệ sau đây:

Caugth exception of type java.lang.ClassCastException with message javax.swing.plaf.nimbus.DerivedColor$UIResource cannot be cast to javax.swing.Painter 
java.lang.ClassCastException: javax.swing.plaf.nimbus.DerivedColor$UIResource cannot be cast to javax.swing.Painter 
    at javax.swing.plaf.nimbus.NimbusStyle.getBackgroundPainter(NimbusStyle.java:708) 
    at javax.swing.plaf.nimbus.SynthPainterImpl.paintBackground(SynthPainterImpl.java:99) 
    at javax.swing.plaf.nimbus.SynthPainterImpl.paintPanelBackground(SynthPainterImpl.java:957) 
    at javax.swing.plaf.synth.SynthPanelUI.update(SynthPanelUI.java:155) 
    at javax.swing.JComponent.paintComponent(JComponent.java:778) 
    at javax.swing.JComponent.paint(JComponent.java:1054) 
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221) 
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1482) 
    at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1413) 
    at javax.swing.RepaintManager.paint(RepaintManager.java:1206) 
    at javax.swing.JComponent._paintImmediately(JComponent.java:5169) 
    at javax.swing.JComponent.paintImmediately(JComponent.java:4980) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728) 
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677) 
    at javax.swing.RepaintManager.access$700(RepaintManager.java:59) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:682) 
    at java.awt.EventQueue$3.run(EventQueue.java:680) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:691) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:155) 
    at java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:182) 
    at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:221) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:219) 
    at java.awt.Dialog.show(Dialog.java:1077) 
    at java.awt.Component.show(Component.java:1651) 
    at java.awt.Component.setVisible(Component.java:1603) 
    at java.awt.Window.setVisible(Window.java:1014) 
    at java.awt.Dialog.setVisible(Dialog.java:1003) 
    at java_awt_Dialog$setVisible.call(Unknown Source) 
    at org.openfidelia.views.core.impl.WorkbenchImpl$_showViewAsDialog_closure1.doCall(WorkbenchImpl.groovy:375) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSite.invoke(PogoMetaMethodSite.java:226) 
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:52) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141) 
    at org.openfidelia.views.core.impl.WorkbenchImpl$_showViewAsDialog_closure1.doCall(WorkbenchImpl.groovy) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1047) 
    at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1110) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:877) 
    at groovy.lang.Closure.call(Closure.java:412) 
    at groovy.lang.Closure.call(Closure.java:406) 
    at groovy.lang.Closure.run(Closure.java:490) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:241) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:682) 
    at java.awt.EventQueue$3.run(EventQueue.java:680) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:691) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:155) 
    at java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:182) 
    at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:221) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:219) 
    at java.awt.Dialog.show(Dialog.java:1077) 
    at java.awt.Component.show(Component.java:1651) 
    at java.awt.Component.setVisible(Component.java:1603) 
    at java.awt.Window.setVisible(Window.java:1014) 
    at java.awt.Dialog.setVisible(Dialog.java:1003) 
    at java_awt_Dialog$setVisible.call(Unknown Source) 
    at org.openfidelia.views.core.impl.WorkbenchImpl$_showViewAsDialog_closure1.doCall(WorkbenchImpl.groovy:375) 

tôi không có bất kỳ ý tưởng khi điều này xảy ra, nó chỉ hiếm khi xảy ra, khi một hộp thoại được hiển thị.

Tôi đã tìm kiếm trong Google (http://netbeans.org/bugzilla/show_bug.cgi?id=212757) và điều đó xảy ra với nhiều người hơn, nhưng dường như không ai biết nguyên nhân của sự cố này.

Điều này có xảy ra với bất kỳ ai khác không? Có lẽ đó là một lỗi Nimbus?

+1

vui lòng và từ mã của bạn ???, hệ điều hành gốc, JDK, JRE, chỉ là sự tò mò của tôi .... – mKorbel

+1

không nhất thiết là lỗi Nimbus: có thể là một số ứng dụng/mã bên thứ ba vô tình thiết lập giao diện người dùng loại giá trị không chính xác, fi 'UIManager.put (" Panel.backgroundPainter ", UIManager.get (" Panel.background "))' Bất cứ ai là thủ phạm, các lỗi này khó theo dõi, đặt cược tốt nhất là a) cố gắng bằng cách nào đó làm cho nó có thể tái tạo b) debug – kleopatra

Trả lời

2

Điều vừa giúp tôi theo dõi nguyên nhân của các vấn đề này là loại bỏ chuỗi hiện tại tại điểm trong mã ứng dụng đang kích hoạt cập nhật giao diện người dùng. : LOGGER.debug("Current thread: " + Thread.currentThread());

Nếu chuỗi được in ra ngoài thứ gì đó không phải là chủ đề [AWT-EventQueue-0,6, main] (nơi các con số có thể là bất kỳ thứ gì) thì bạn đang cố thực hiện cập nhật giao diện người dùng bên ngoài Swing Sự kiện Dispatch Thread và repaint vấn đề là gần như không thể tránh khỏi.

Sử dụng SwingUtilities.invokeLater() hoặc .invokeAndWait() có thể giảm thiểu điều này nhưng thông thường vấn đề này sẽ chỉ ra lỗi trong thiết kế của ứng dụng. Trong trường hợp của tôi, tôi đã (không cần thiết) thiết lập một trình kết xuất ô cho một JTree như là một phần của việc cập nhật mô hình cây.

Các vấn đề liên quan