2017-02-25 68 views
-1

我已经阅读了很多关于这个问题的答案,但我无法找到我的错误,即使是一个简单的代码。下面是问题:我想在JPanel中的JLabel中绘制图像,但未调用JLabel的paintComponent()方法。Java重绘()不调用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,图像绘制正确。这可能是一个愚蠢的错误,但我花了几个小时试图找到它,真的看不到它。先谢谢你 !

+0

1)为了更好地提供帮助,请发布[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。 (把'main'方法放在'Display'类中,将它引入到2个类中,然后将'ImagePainter'从'public'降级到默认访问并粘贴到最后。)2)获取图像的一种方法)例如是热链接到[此Q&A](http://stackoverflow.com/q/19209650/418556)中看到的图像。 –

回答

2

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

但是,如果图像显示在标签中,为什么不将图像设置为标签的图标?

+0

好的,谢谢!所以我只需要改变布局管理器,什么样的布局管理器可以使它工作? – Alsvartr

+0

首先我想了解为什么代码是自定义绘制标签。为什么这样做? –

+0

顺便说一句 - 为面板设置不同的布局并不是解决问题的最佳方法,即使自定义绘制标签也是有意义的。 –

0

此外,Display构造函数中的jp.repaint()语句无用,因为您尚未将框架设置为可见。