2014-03-05 164 views
0

我在谷歌搜索了這個話題,但是我不知道該怎麼做。 我的問題是:爲什麼圖像不顯示?

  1. 我的代碼出了什麼問題?如何修改它。

  2. 許多網站的答案總是使用URL,我怎麼知道我的圖片的網址?

下面是代碼:

import java.awt.BorderLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class TwoPanel { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame ("Key test"); 
     MyDrawPanel1 dp1 = new MyDrawPanel1(); 
     //MyDrawPanel2 dp2 = new MyDrawPanel2(); 
     //MyDrawPanel3 dp3 = new MyDrawPanel3(); 
     //MyDrawPanel4 dp4 = new MyDrawPanel4(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible (true); 
     JPanel p = new JPanel(); 
     p.setLayout(new BorderLayout()); 
     p.add (dp1); 
     //p.add (dp2); 
     //p.add(dp3); 
     //p.add(dp4); 
     frame.getContentPane().add(p); 
     frame.pack(); 
    } 
} 

那麼drawpanel:

public class MyDrawPanel1 extends JPanel { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    Image image = new ImageIcon("Koala.jpg").getImage();/*something new: if i use the 

    path to the disk name(D:/Java/workspace/firstJava/src/com/founder/panel/Koala.jpg'),  

    it can work.*/ 

    public void paintComponent (Graphics g) { 
     super.paintComponent(g); 
     //Graphics2D g2 = (Graphics2D) g; 
     g.drawImage(image, 3, 4, null); 
    } 
    public Dimension getPreferredSize() { 
     if (image != null) { 
      return new Dimension(image.getWidth(null), image.getHeight(null)); 
     } 
     return super.getPreferredSize(); // default 
    } 
} 

這個面板可以工作,雖然我上無法理解爲什麼其他不起作用

package com.founder.panel; 

import java.awt.Graphics; 

import javax.swing.JPanel; 
import java.awt.*; 
import java.awt.image.*; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.imageio.ImageIO; 

public class MyDrawPanel4 extends JPanel{ 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

private static final String URL_PATH = "file:///D:/Java/workspace/firstJava/src/com/founder/panel/" + 
     "Koala.jpg"; 

BufferedImage image = null; 

public MyDrawPanel4() { 
    // TODO Auto-generated constructor stub 

     setBackground(Color.white); 
     try { 
     image = ImageIO.read(new URL(URL_PATH)); 
     } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (image != null) { 
     return new Dimension(image.getWidth(), image.getHeight()); 
     } 
     return super.getPreferredSize(); // default 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (image != null) { 
     g.drawImage(image, 0, 0, null); 
     } 
    } 
    } 
+2

嘗試在幀後添加組件並打包幀後調用'setVisible' – MadProgrammer

+0

對不起,圖像仍然不顯示 – Tony

+1

然後圖像不是加載。存儲的圖像在哪裏(與您的應用程序有關)? – MadProgrammer

回答

1

我的猜測是圖像沒有加載,使用該文件的路徑作爲參數ImageIO.read(new File("Koala.jpg"))。使用ImageIO

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class TwoPanel { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       showMainWindow(); 
      } 
     }); 
    } 

    public static void showMainWindow() { 
     JFrame frame = new JFrame ("Key test"); 
     MyDrawPanel1 dp1 = new MyDrawPanel1(); 
     //MyDrawPanel2 dp2 = new MyDrawPanel2(); 
     //MyDrawPanel3 dp3 = new MyDrawPanel3(); 
     //MyDrawPanel4 dp4 = new MyDrawPanel4(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel p = new JPanel(); 
     p.setLayout(new BorderLayout()); 
     p.add (dp1); 
     //p.add (dp2); 
     //p.add(dp3); 
     //p.add(dp4); 
     frame.getContentPane().add(p); 
     frame.setLocationRelativeTo(null); // center frame 
     frame.setMinimumSize(new Dimension(300,400)); // make the frame at least 300x400 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

MyDrawPanel1

class MyDrawPanel1 extends JPanel { 

    private static final long serialVersionUID = 1L; 
    //Image image = new ImageIcon("Koala.jpg").getImage(); 
    BufferedImage image; 

    MyDrawPanel1() { 
     super(); 
     try { 
      this.image = ImageIO.read(getClass().getResource("com/founder/pane/Koala.jpg")) 
     } catch (IOException e) { 
      System.err.println("Koala.jpg does not exist!"); 
      e.printStackTrace(); 
     } 
    } 
    @Override 
    public void paintComponent (Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image, 3, 4, null); 
    } 
} 
+1

ImageIO.read(new File(「Koala.jpg」))與新ImageIcon(「Koala.jpg」)的區別是什麼?它不同之處在於它可以拋出一個' IOException'如果無法找到或讀取圖像...? – MadProgrammer

+0

這是不是一個足夠的理由,而不是吞嚥異常?無論如何,使用'ImageIcon'你很可能會使用'BufferedImage'。 – 2014-03-05 07:17:49

+0

通常,是的,但是這並不能解決OP有問題 – MadProgrammer

2

的問題ImageIcon(String)正在尋找該程序在被執行的當前目錄中名爲Koala.jpg文件

您的圖像什麼是已知的嵌入式資源,你不能像訪問它是一個文件,而是你需要使用Class#getResource,例如...

Image image = new ImageIcon(MyDrawPanel1.class.getResource("Koala.jpg")).getImage(); 

Preferrably,ImageIO會是一個更好的選擇......

class MyDrawPanel1 extends JPanel { 
    private BufferedImage image; 

    pubic MyDrawPanel1() { 
     try { 
      // If the image resides in the same package as the class 
      image = ImageIO.read(getClass().getResource("Koala.jpg")); 
      // If the image resides somewhere else... 
      image = ImageIO.read(getClass().getResource("/path/to/image/Koala.jpg")); 
     } catch (IOException exp) { 
      exp.printStackTrace(); 
     } 

ImageIOImageIcon讀取更多格式的能力,也將引發IOException如果文件無法讀取可由於某種原因(就像它不存在)

+0

「d:/ Java的/工作區/ firstJava/src目錄/ COM /創始人/面板」 – Tony

+0

的路徑應該是相對於類路徑之上,基於你的例子'/ com/founder/pane' – MadProgrammer

+0

謝謝。但它仍然不起作用。並且不打印堆棧跟蹤 – Tony