【问题标题】:Cannot mix lightweight and heavyweight components in an undecorated JFrame不能在未修饰的 JFrame 中混合轻量级和重量级组件
【发布时间】:2014-07-07 01:26:32
【问题描述】:

我正在尝试根据 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 错误?

【问题讨论】:

  • 基本问题:为什么需要混合轻量和重量的组件?最后我读到的是 SUN 说这不是一个好主意(或者是不久前的课程)。如果只使用 swing 而不混合 AWT 组件会发生什么?
  • 我们不能实现纯粹的轻量级,因为 Java 3D 引擎在底层都使用 OpenGL 原生画布。我们不能只做重量级的,因为我们的应用程序的遗留部分是基于 Swing 的,并且几乎没有动力去重写它(我们不需要这些组件的 3D)。
  • 是的,我链接的文章比你的更新。

标签: java swing


【解决方案1】:

您的代码看起来不错,因为如果您使用 JPanel 而不是 Canvas 来表示 red,它的工作方式与您想象的一样。这似乎是混合重量级和轻量级组件的错误。

正如this question on overlapping components 的选定答案中所述,如果涉及将 轻量级 组件与 重量级 组件重叠,那么混合重量级和轻量级组件似乎仍然是个坏主意strong> 组件。

但是,将 heavyweight 重叠在 lightweight 组件上似乎确实有效,因此如果您将 green 更改为 Canvas 并将 red 更改为 JPanel,它将工作。如果两者都是 JPanel 或两者都是 Canvases,它也可以工作。

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

希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      相关资源
      最近更新 更多