Невозможно нарисовать простое изображение, используя JComponent - PullRequest
1 голос
/ 30 июля 2011

Я использую IDE NetBeans для отработки некоторого базового кода Java.Но мне не удается нарисовать изображение PNG.Ниже мой код,

package JavaApplication1;

import javax.swing.*;
import java.awt.*;

class MyCanvas extends JComponent
{
    Image img;
    public MyCanvas(){
        img = Toolkit.getDefaultToolkit().createImage("pengbrew.png");
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawImage(img, 0, 0, null);
    }
}

public class JavaGame
{
    public static void main(String args[]){
        JFrame window = new JFrame("Image demo");
        window.getContentPane().add( new MyCanvas() );
        window.setSize(400,400);
        window.setVisible(true);
    }
}

Я добавил изображения в проект NetBeans.

Пожалуйста, сообщите.

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 02 августа 2011

Для загрузки изображения используйте ImageIO.read(File file).Это более новый API, более простой в использовании и лучше поддерживаемый.Учебное пособие по загрузке изображений находится здесь http://docs.oracle.com/javase/tutorial/2d/images/loadimage.html, если вам нужно больше указателей.

Вместо этого ваш код будет выглядеть так:

Image img;
public MyCanvas(){
    try {
        img = ImageIO.read(new File("pengbrew.png"));
    } catch (IOException e) {
        // Handle exception if there is one.
    }
}

Для длинного ответа о том, почемуМетод, который вы использовали, не работал, вероятно, из-за следующего ...

Возможно, ваше изображение находится в правильном месте, и вместо этого Toolkit.createImage () не завершил загрузку изображения до появления кадрарисовать.Toolkit.createImage () возвращает элемент управления обратно в ваше приложение до того, как базовое изображение будет фактически загружено.Обычно вы можете проверить, является ли это проблемой, изменив размер приложения, чтобы оно перекрасилось.Если после нескольких секунд попытки изменить размер приложения изображение отображается, это было связано с тем, что изображение не загружалось во время первых вызовов краски.

Чтобы убедиться, что изображение загружено перед продолжением, необходимо использоватьMediaTracker.Вот пример кода, который гарантирует, что загрузка Image завершена перед его использованием.

Component component = new Component() {};
MediaTracker TRACKER = new MediaTracker(component);

...

Image image = Toolkit.getDefaultToolkit().createImage("imageToLoad.png");
synchronized(TRACKER) {
   int id = ++mediaTrackerID;
   TRACKER.addImage(image, id);
   try {
       TRACKER.waitForID(id, 0);
   } catch (InterruptedException ex) {
       image = null;
   }
   TRACKER.removeImage(image, id);
}
// Now you can use your image.

Вы увидите такой же код в классе ImageIcon в методе loadImage (Image image).

2 голосов
/ 30 июля 2011

Самым простым способом является поиск JLabel , который лучше JComponents для Icon / ImageIcon примеров здесь

...