无法将项目添加到自定义绘制的JPanel

时间:2010-12-10 11:24:20

标签: java swing

当我尝试使用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 个答案:

答案 0 :(得分:3)

这不起作用的原因是因为paintComponent方法没有绘制添加的组件。在paintComponent方法的开头调用super.paintComponent(g)应该解决这个问题。

答案 1 :(得分:0)

没有必要调用super.paintComponent(Graphics g)来绘制子组件。该调用对于绘制背景非常有用,但并非严格必要。

我测试了Java 6上的代码,它对我来说很好。我做的唯一修改是在构造函数中添加以下行:

add(new JLabel("Test"));

我没有背景图片文件,因此图片绘制代码什么也没做。背景图像以某种方式模糊子组件,或者代码中存在添加子组件的错​​误。尝试注释掉drawImage调用,看看子组件是否可见。

答案 2 :(得分:-2)

我会调用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();