Невозможно добавить элементы в окрашенную JPanel - PullRequest
1 голос
/ 10 декабря 2010

Когда я пытаюсь использовать myCustomPanel.add(someComponent), он не добавляет ...

Вот мой пользовательский класс JPanel:

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JPanel;


/**
 *
 * @author Jacob
 */
public class OSXMainPanel extends JPanel {
    public static final long serialVersionUID = 24362462L;


    private Image image;


    public OSXMainPanel() {
        super.setOpaque(true);
        try {
            image = javax.imageio.ImageIO.read(new java.net.URL(getClass().getResource("/assets/background.png"), "background.png"));
        } catch (Exception e) {}
    }


    @Override
    protected void paintComponent(Graphics g) {
        if (isOpaque())
        {
            g.setColor(getBackground());
            g.fillRect(0, 0, getWidth(), getHeight());
        }
        for(int w = 0; w < this.getWidth(); w = w + 50) {
            for(int h = 0; h < this.getHeight(); h = h + 50) {
                g.drawImage(image, w, h, 50, 50, this);
            }
        }
    }


}

Ответы [ 3 ]

3 голосов
/ 10 декабря 2010

Причина, по которой это не работает, заключается в том, что ваш метод paintComponent не рисует добавленные компоненты. Вызов super.paintComponent (g) в начале метода paintComponent должен исправить это.

0 голосов
/ 10 декабря 2010

Нет необходимости вызывать super.paintComponent (Graphics g) для рисования дочерних компонентов. Вызов полезен, чтобы нарисовать фон, но не обязательно.

Я протестировал код на Java 6, и он работал нормально для меня. Единственное изменение, которое я сделал, было добавить следующую строку в конструктор:

add(new JLabel("Test"));

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

0 голосов
/ 10 декабря 2010

Я бы вызвал updateUI ()

myPanel.add(new JLabel("wanna see it"));
// change of look and feel
myPanel.updateUI();

после добавления компонента - если вы хотите обновить весь внешний вид.В противном случае используйте revalidate ().

myPanel.add(new JLabel("wanna see this"));
myPanel.revalidate();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...