Java repaint()没有调用paintComponent()来绘制图像

时间:2017-02-25 18:45:07

标签: java image swing jlabel repaint

我已经阅读了很多关于这个问题的答案,但即使是在一个简单的代码上我也无法找到我的错误。问题在于:我想在JPLnel中的JLabel中绘制一个Image,但是JLabel的paintComponent()方法没有被调用。

以下是代码:

ImagePainter类应绘制图像

public class ImagePainter extends JLabel{
    private Image image;

    public ImagePainter(){
        try {
            image = ImageIO.read(new File("src/testgui/image.png"));
        } catch (IOException exception) {
            exception.printStackTrace();
        }
    }

    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
        System.out.println("in paintComponent");
    }
}

这是一个标准的JFrame。我小心地将JPanel添加到contentPane

public class Display extends JFrame{

    public Display(){
        JPanel jp = new JPanel();
        ImagePainter i = new ImagePainter();

        getContentPane().add(jp);
        jp.add(i);
        jp.repaint();

        setSize(800, 800);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
}

最后是主力。我在EDT上实现显示,就像每个人都说的那样:

public class Main {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable(){
            @Override
            public void run(){
                Display d = new Display();
            }
        });
    }

}

最后,我观察到如果我直接将ImagePainter添加到contentPane,则会正确绘制图像。这可能是一个愚蠢的错误,但我花了几个小时试图找到它并且真的无法看到它。提前谢谢!

2 个答案:

答案 0 :(得分:2)

当图像是自定义绘制时,标签不考虑图像的首选大小!默认情况下,面板具有流布局。流布局不会拉伸组件以适应。因此该标签的大小为0 x 0像素。您可以通过在标签上添加可见边框来确认。

但鉴于图像显示在标签中,为什么不将图像设置为标签的图标?

答案 1 :(得分:0)

此外,Display构造函数中的text = Regex.Replace(text, @"\([^)]*\)", ""); text = Regex.Replace(text, @"\s{2,}", " "); 语句没用,因为您尚未将框架设置为可见。