2015-04-03 109 views
0

两天来我试图从文件中加载图像到JPanel。我不能!加载图像到JPanel不起作用

我用JLabelIcon它的加载没问题,但我需要直接加载图像到JPanel,这是不可能的?

因为差不多我看到很多这样的相关问题,很多人推荐问问题的人把图像加载到标签中!

这是代码:

public class ReadingImage extends JPanel { 
JPanel panel; 
JFrame frame; 
JPanel secPanel; 
private BufferedImage img; 


public ReadingImage(String path){ 
    frame = new JFrame(); 
    frame.setVisible(true); 
    frame.setLocation(300, 300); 
    frame.setSize(300, 500); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLayout(new BorderLayout()); 

    secPanel = new JPanel(); 
    secPanel.setVisible(true); 
    //secPanel.setLayout(new FlowLayout()); 

    secPanel.repaint(); 

    frame.getContentPane().add(secPanel); 

    try{ 
     FileImageInputStream fi = new FileImageInputStream(new File(path)); 
     //System.out.println(path); 
     img = ImageIO.read(fi); 
     this.repaint(); 
    } 
    catch (IOException io){ io.printStackTrace();} 
} 

@Override 
protected void paintComponent(Graphics g){ 
    super.paintComponents(g); 
    if (img!=null){ 
     g.drawImage(img, 0, 0, this); 
     repaint(); 
    } 
} 
} 

它不扔任何异常,但它不是在JPanel显示图像!

我调整引起的扩展JPanel并使用另一个JPanel的代码很多,很多次..

在这个任何帮助:)

感谢,

+0

您是否尝试过这里提到的解决方案,http://stackoverflow.com/questions/299495/how-to-add-an-image-to-a-jpanel – 2015-04-03 11:04:21

回答

2

经典混乱。用frame.add(this , BORDERLAYOUT.CENTER)代替frame.getContentPane().add(secPanel),一切都应该正常工作。

+0

非常感谢:) 我没想到这是狡猾的错误:) 我可以问我们是否可以添加图片的固定大小,所以通过我的程序,我决定哪种尺寸更好,而不是照片尺寸? 谢谢:) – Omarkk 2015-04-03 11:18:00

+0

当然,'图形'还提供了其他方法来绘制图像。使用:'g.drawImage(img,x,y,width,height,null)'绘制图像 – Paul 2015-04-03 11:49:38

+0

@Paul您应该使用'g.drawImage(img,x,y,this)',否则组件可能不知道当图像状态发生变化时 – MadProgrammer 2015-04-03 21:48:13

2

您调用paintComponentsuper.paintComponents(g);,而不是s末,这将导致StackOverflowException最终,但实际上不能添加ReadingImageJPanel任何东西,所以它实际上从未画

这意味着,似乎没有要任何一点的任何点到secPane

你也应该避免从其他组件中创建帧,特别是从构造方法中,它提供组件

0一个非常极限的情况下使用
import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.imageio.stream.FileImageInputStream; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class ReadingImage extends JPanel { 

    private BufferedImage img; 

    public ReadingImage(String path) { 
     try { 
      FileImageInputStream fi = new FileImageInputStream(new File(path)); 
      img = ImageIO.read(fi); 
      this.repaint(); 
     } catch (IOException io) { 
      io.printStackTrace(); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (img != null) { 
      g.drawImage(img, 0, 0, this); 
      repaint(); 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame(); 
       frame.add(new ReadingImage("Your image")); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLocation(300, 300); 
       frame.setSize(300, 500); 
       frame.setVisible(true); 

      } 
     }); 
    } 

} 

我不知道你想实现什么,但我也建议你重写ReadingImagegetPreferredSize方法,并返回图像的大小,这使得它更容易布局

0

首先在图像图标中加载图像,让对象说成'图片'。

panel1.add(new JLabel(pic));

添加并将panel1设置为可见。

+1

Swing组件在默认情况下是可见的(除了'Window'类和'JInternalFrame'外) – MadProgrammer 2015-04-03 11:11:29