Загрузить изображение в JPanel? - PullRequest
1 голос
/ 20 апреля 2011

Я не могу понять, почему этот код не работает. Есть идеи?

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 ]

2 голосов
/ 20 апреля 2011

Я тоже не уверен, что вы пытаетесь сделать, но ваш код выглядит как старый пример AWT и не должен использоваться для Swing.

  1. нет необходимости отменять обновление ()
  2. paintComponent () должен вызывать super.paintComponent ()

Прочитайте учебник Swing на Как использовать значки , например, код, который использует изображения на этикетках.

2 голосов
/ 20 апреля 2011

В вашем коде вам не хватает JFrame или JDialog для содержания вашего 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...