Фоновое изображение в JFrame - PullRequest
3 голосов
/ 15 апреля 2010

Этот вопрос задавался много, но везде ответы не отвечают. Я могу заставить JFrame нормально отображать фоновое изображение, расширяя JPanel и переопределяя paintComponent, например так:

class BackgroundPanel extends JPanel {
    private ImageIcon imageIcon;
    public BackgroundPanel() {
        this.imageIcon = Icons.getIcon("foo");
  }

    @Override
    protected void paintComponent(Graphics g) {
       super.paintComponent(g);
        g.drawImage(imageIcon.getImage(), 0,0,imageIcon.getIconWidth(),imageIcon.getIconHeight(),this);
    }
}

Но как теперь добавить компонент поверх этого фона? Когда я иду

JFrame w = new JFrame() ;
Container cp = w.getContentPane();
cp.setLayout(null);

BackgroundPanel bg = new BackgroundPanel();
cp.add(bg);

JPanel b = new JPanel();
b.setSize(new Dimension(30, 40));
b.setBackground(Color.red);
cp.add(b);
w.pack()
w.setVisible(true)

Он показывает маленький красный квадрат (или любой другой компонент), а не фон, но когда я удаляю cp.setLayout(null);, появляется фон, но не мой другой компонент. Я предполагаю, что это как-то связано с тем, что paintComponent не вызывается нулевым LayoutManager, но я совсем не знаком с тем, как работает LayoutManager (это проект для колледжа, и в задании специально сказано не использовать LayoutManager) .

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

У кого-нибудь есть идеи?

Спасибо

Ответы [ 3 ]

5 голосов
/ 15 апреля 2010

При использовании макета null (а вы почти никогда не должны), вы должны указать границы для каждого компонента, в противном случае по умолчанию он равен (0 x, 0 y, 0 width, 0 height) и компонент не будет отображаться.

BackgroundPanel bg = new BackgroundPanel();
cp.add(bg);

не дает границ. Вам нужно будет сделать что-то вроде:

BackgroundPanel bg = new BackgroundPanel();
bg.setBounds(100, 100, 100, 100);
cp.add(bg);

Что бы сделать bg размером 100 x 100 и поместить его на 100 x, 100 y на раму.

3 голосов
/ 15 апреля 2010

Смотрите в документации на Root Pane всю необходимую информацию. Обратите внимание на наличие многослойной панели и стеклянной панели, а также панели содержимого.

2 голосов
/ 15 апреля 2010

По умолчанию все компоненты имеют размер 0. То, что вы рисуете на компоненте, не дает ему размера. Вы по-прежнему несете ответственность за установку размера. Вот почему вы всегда должны использовать менеджер макетов. Он заботится обо всем этом, поэтому вам не о чем беспокоиться.

Я не знаю, почему новички всегда думают, что они не могут использовать менеджер раскладки. Да, на изучение уйдет еще пара минут, но в долгосрочной перспективе это избавит вас от горя.

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

...