Нельзя смешивать легкие и тяжелые компоненты в неокрашенном JFrame - PullRequest
2 голосов
/ 14 января 2011

Я пытаюсь смешать тяжелые и легкие компоненты в соответствии с этими рекомендациями.

Я ожидаю, что следующий код закрасит все окно в зеленый цвет.Вместо этого он отображает половину экрана красным цветом:

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 голосов
/ 23 февраля 2011

Согласно Oracle, это известное ограничение, которое будет исправлено в будущем: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7012806

0 голосов
/ 17 января 2011

Ваш код выглядит нормально, так как он работает так, как вы думаете, если бы вы использовали JPanel вместо Canvas для red. Похоже, это ошибка при смешивании тяжелых и легких компонентов.

Как упомянуто в выбранном ответе на этот вопрос о перекрывающихся компонентах , кажется, что все же плохая идея смешивать тяжелые и легкие компоненты, если это предполагает перекрытие облегченного компонента над тяжеловесный компонент.

Однако перекрытие тяжеловесного над легковесным компонентом, похоже, сработает, поэтому если вы измените green на Canvasи red в JPanel, это будет работать.Это также будет работать, если оба являются JPanels или оба являются Canvases.

При этом, если вам действительно не нужно, обычно лучше избегать смешивания легких и тяжелых компонентов.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...