Java Applet:仅在浏览器中出现视觉错误,并从Swing中抛出异常

Java Applet:仅在浏览器中出现视觉错误,并从Swing中抛出异常,java,swing,paint,classcastexception,jtextcomponent,Java,Swing,Paint,Classcastexception,Jtextcomponent,我们在办公室里一直在努力解决一个看似无法解决的bug,它出现在我们的一个(大型)小程序中,这是一个用于考试目的的MS Word的Java模拟程序。这个例外似乎源于swing本身,我不确定如何着手解决它。下面是发生的情况: 小程序以加载屏幕加载,直到100%。在此之后,所有组件都以中断方式显示,就好像它们的某些绘制方法没有被正确调用一样,将光标悬停在某些按钮上等会使它们闪烁/显示一段时间。每隔一秒钟左右,控制台就会打印一个异常。(见下文)此错误不会在Eclipse中出现,只会在浏览器中出现。 摘要

我们在办公室里一直在努力解决一个看似无法解决的bug,它出现在我们的一个(大型)小程序中,这是一个用于考试目的的MS Word的Java模拟程序。这个例外似乎源于swing本身,我不确定如何着手解决它。下面是发生的情况:

小程序以加载屏幕加载,直到100%。在此之后,所有组件都以中断方式显示,就好像它们的某些绘制方法没有被正确调用一样,将光标悬停在某些按钮上等会使它们闪烁/显示一段时间。每隔一秒钟左右,控制台就会打印一个异常。(见下文)此错误不会在Eclipse中出现,只会在浏览器中出现。

摘要:小程序组件都是毫无例外地构建的,但在某个组件的每次“绘制”调用(我假设)中,它都会在视觉上出错,并每秒打印以下内容:

Exception in thread "AWT-EventQueue-11" java.lang.ClassCastException: javax.swing.JLabel cannot be cast to javax.swing.text.JTextComponent
 at javax.swing.text.html.EditableView.paint(Unknown Source)
 at javax.swing.text.BoxView.paintChild(Unknown Source)
 at javax.swing.text.BoxView.paint(Unknown Source)
 at javax.swing.text.BoxView.paintChild(Unknown Source)
 at javax.swing.text.BoxView.paint(Unknown Source)
 at javax.swing.text.ParagraphView.paint(Unknown Source)
 at javax.swing.text.html.ParagraphView.paint(Unknown Source)
 at javax.swing.text.BoxView.paintChild(Unknown Source)
 at javax.swing.text.BoxView.paint(Unknown Source)
 at javax.swing.text.html.BlockView.paint(Unknown Source)
 at javax.swing.text.BoxView.paintChild(Unknown Source)
 at javax.swing.text.BoxView.paint(Unknown Source)
 at javax.swing.text.html.BlockView.paint(Unknown Source)
 at javax.swing.plaf.basic.BasicHTML$Renderer.paint(Unknown Source)
 at javax.swing.plaf.basic.BasicLabelUI.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.JLayeredPane.paint(Unknown Source)
 at javax.swing.JComponent.paintToOffscreen(Unknown Source)
 at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
 at javax.swing.RepaintManager.paint(Unknown Source)
 at javax.swing.JComponent._paintImmediately(Unknown Source)
 at javax.swing.JComponent.paintImmediately(Unknown Source)
 at javax.swing.RepaintManager$3.run(Unknown Source)
 at javax.swing.RepaintManager$3.run(Unknown Source)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.security.ProtectionDomain$1.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$1000(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$200(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$1.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版本

塔克斯

java.lang.ClassCastException:javax.swing.JLabel不能强制转换为 javax.swing.text.JTextComponent

  • 请参阅组件树以了解,没有JLabel,JLabel不是JTextComponents的成员

  • 最安全的方法是在任何铸造之前测试
    if(JTextComponent的Xxx实例)

java.lang.ClassCastException:javax.swing.JLabel不能强制转换为 javax.swing.text.JTextComponent

  • 请参阅组件树以了解,没有JLabel,JLabel不是JTextComponents的成员

  • 最安全的方法是在任何铸造之前测试
    if(JTextComponent的Xxx实例)


    • 找到了解决我问题的方法。目标Java版本错误。在
      build.xml
      文件中,有以下几行:

      <property name="target" value="1.5" />
      <property name="source" value="1.5" />
      
      
      

      将它们更改为
      1.7
      ,瞧!这似乎是一个Swing错误,已在较新版本的Java中修复。

      找到了解决我问题的方法。目标Java版本错误。在
      build.xml
      文件中,有以下几行:

      <property name="target" value="1.5" />
      <property name="source" value="1.5" />
      
      
      

      将它们更改为
      1.7
      ,瞧!这似乎是一个Swing bug,已在较新版本的Java中修复。

      我注意到,当内容周围带有标记的JLabel包含嵌套标记时,可能会出现此问题。解决方案是避开

      上的尖括号。我注意到,当内容周围带有标记的JLabel包含嵌套标记时,可能会出现此问题。解决方案是退出

      上的尖括号,除非转换发生在Swing内部代码的深处。所以真正的问题(和真正的答案)是一个
      JLabel
      如何最终成为
      BoxView
      的孩子。这是奇怪的部分。在我的代码中,没有对JTextComponent的任何子组件或JTextComponent进行转换。那么堆栈跟踪是否会将我指向我的源,而不是指向swing中的源?也适用于小程序。@DavidKroukamp:这可能解释了环境依赖性。Mammon:也可以参考这些,由mKorbel引用。除了演员阵容发生在Swing内部代码的深处。所以真正的问题(和真正的答案)是一个
      JLabel
      如何最终成为
      BoxView
      的孩子。这是奇怪的部分。在我的代码中,没有对JTextComponent的任何子组件或JTextComponent进行转换。那么堆栈跟踪是否会将我指向我的源,而不是指向swing中的源?也适用于小程序。@DavidKroukamp:这可能解释了环境依赖性。Mammon:另请参见mKorbel引用的这些。删除模块中的所有内容,保留裸骨小程序,然后开始逐块添加,直到在代码中找到产生错误的位置。查看抛出的方法,似乎有一个
      JLabel
      充当文本组件的容器。首先,我会在您的任何标签上寻找对
      add()
      的调用。对于这样一个大型且编码错误的小程序,这是我最后的选择。但是,是的,我目前正在尝试缩小触发器的范围。好主意,现在就开始寻找。删除模块中的所有内容,留下基本的applet,然后开始逐段添加,直到找到在代码中产生错误的位置。查看抛出的方法,似乎有一个
      JLabel
      充当文本组件的容器。首先,我会在您的任何标签上寻找对
      add()
      的调用。对于这样一个大型且编码错误的小程序,这是我最后的选择。但是,是的,我正在努力缩小触发范围。好主意,现在就找。