2014-03-05 159 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