2015-04-03 97 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