无法在未修饰的JFrame中混合轻量级和重量级组件

我试图根据这些指南混合重量级和轻量级组件。

我期待以下代码将整个窗口绘制为绿色。 相反,它将屏幕的一半渲染为红色:

import java.awt.Canvas; import java.awt.Color; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JLayeredPane; import javax.swing.JPanel; public class Testcase extends Canvas { private static final long serialVersionUID = 0L; public static void main(String[] arg) { final boolean enableWorkaround = false; EventQueue.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); JLayeredPane layers = new JLayeredPane(); frame.getContentPane().add(layers); JPanel green = new JPanel(); green.setBackground(Color.GREEN); green.setBounds(0, 0, 800, 600); layers.add(green, Integer.valueOf(1)); Canvas red = new Canvas(); red.setBackground(Color.RED); red.setBounds(0, 0, 400, 600); layers.add(red, Integer.valueOf(0)); frame.setSize(800, 600); if (!enableWorkaround) frame.setUndecorated(true); frame.setVisible(true); } }); } } 

转载于:

 java version "1.6.0_23" Java(TM) SE Runtime Environment (build 1.6.0_23-b05) Java HotSpot(TM) Client VM (build 19.0-b09, mixed mode, sharing) 

 java version "1.7.0-ea" Java(TM) SE Runtime Environment (build 1.7.0-ea-b124) Java HotSpot(TM) Client VM (build 20.0-b05, mixed mode, sharing) 

我的代码是否包含任何错误或这是一个合法的JDK错误?

您的代码看起来很好,因为它可以像你想象的那样使用JPanel而不是Canvas用于red 。这似乎是混合重量级和轻量级组件的一个错误。

正如在关于重叠组件的这个问题的选定答案中所提到的,如果它涉及重量级组件重叠轻量级组件,那么混合重量级和轻量级组件似乎仍然是一个坏主意。

但是, 重量级 重量轻量级组件似乎确实有效,因此如果您将green更改为Canvas并将red更改为JPanel,它将起作用。 如果两者都是JPanel或两者都是canvas,它也会起作用。

也就是说,除非你真的需要,否则通常最好避免混合轻量级和重量级组件。

希望有所帮助。

根据Oracle的说法,这是一个已知的限制,将来会修复: http : //bugs.sun.com/bugdatabase/view_bug.do?video_id = 7012806