在JPanel中加载图像?

时间:2011-04-20 03:25:05

标签: java image swing

我无法弄清楚为什么这段代码不起作用。有什么想法吗?

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.image.ImageObserver;
import java.net.URL;

import javax.swing.JPanel;

public class ImageTool extends JPanel {

  private static final long serialVersionUID = 1L;
  private static Image image;

  public ImageTool(URL url) {       
    image = Toolkit.getDefaultToolkit().getImage(url);
    rightSize();
  }

  private void rightSize() {
    int width = image.getWidth(this);
    int height = image.getHeight(this);
    if (width == -1 || height == -1)
      return;
    addNotify();
    System.out.println("Image width: "+width);
    System.out.println("Image height"+height);

  }

  public boolean imageUpdate(Image img, int infoflags, int x, int y,
      int width, int height) {
    if ((infoflags & ImageObserver.ERROR) != 0) {
      System.out.println("Error loading image!");
      System.exit(-1);
    }
    if ((infoflags & ImageObserver.WIDTH) != 0
        && (infoflags & ImageObserver.HEIGHT) != 0) {
      rightSize();
      System.out.println("1");
    }
    if ((infoflags & ImageObserver.SOMEBITS) != 0)
      repaint();
    if ((infoflags & ImageObserver.ALLBITS) != 0) {
        System.out.println("2");
      rightSize();
      repaint();
      return false;
    }
    return true;
  }

  public void update(Graphics g) {
    paint(g);
  }

  public void paintComponent(Graphics g) {
    Insets insets = getInsets();
    g.drawImage(image, insets.left, insets.top, this);
  }
  public static void main(String[] args) throws Exception {
    String url = "http://www.java2s.com/style/logo.png";
    new ImageTool(new URL(url));

  }
}

2 个答案:

答案 0 :(得分:2)

在您的代码中,您错过了一个JFrameJDialog来包含您的JPanel。这是一个我认为可以满足您需求的示例。它将相同的图像加载到可见窗口中,并将尺寸输出到控制台。

public class ImageTool extends JPanel {
    public ImageTool(URL url) {
        ImageIcon icon = new ImageIcon(url);
        JLabel label = new JLabel(icon, JLabel.CENTER);
        add(label);

        System.out.println("Image width: " + icon.getIconWidth());
        System.out.println("Image height: " + icon.getIconHeight());
    }

    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://www.java2s.com/style/logo.png");
        JPanel panel = new ImageTool(url);
        JFrame frame = new JFrame();
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}

答案 1 :(得分:2)

我不确定你要做什么,但你的代码看起来像一个旧的AWT示例,不应该用于Swing。

  1. 无需覆盖update()
  2. paintComponent()应该调用super.paintComponent()
  3. 阅读How to Use Icons上的Swing教程,了解使用标签上图片的示例代码。