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

时间:2011-01-14 20:53:31

标签: java swing

我正在尝试根据these指南混合重量级和轻量级组件。

我希望以下代码将整个窗口绘制为绿色。相反,它将屏幕的一半呈现红色:

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错误吗?

2 个答案:

答案 0 :(得分:0)

您的代码看起来很好,因为它可以正常运行,如果您使用JPanel而不是Canvas for red。这似乎是混合重量级和轻量级组件的错误。

正如this question on overlapping components的选定答案中所提到的,如果将轻量级组件重叠在重量级上,那么混合重量级和轻量级组件似乎仍然是一个坏主意组件。

然而,将重量级重叠在轻量级组件上似乎确实有效,因此如果您将green更改为Canvas并将red更改为JPanel,它会工作。如果两者都是JPanel或两者都是画布,它也会起作用。

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

希望有所帮助。

答案 1 :(得分:0)

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