Не удается получить изображение для отображения в Swing на OSX - PullRequest
1 голос
/ 04 августа 2010

Я думаю, что я немного идиот, учитывая, что я давно не занимался программированием на Swing, но я пытаюсь нарисовать простое изображение на экране, и я не получаю то, что ожидал

public class ImageApp {

    public static void main(String[] args) throws MalformedURLException, IOException {
        final Image image = ImageIO.read(new File("/Library/WebServer/Documents/image.gif"));

        final JPanel component = new JPanel(){

            public void paint(final Graphics g) {
                System.out.println("Drawing image "+image.getWidth(null)+" "+image.getHeight(null));
                g.drawString("hello", 0,0);
                g.drawImage(image,this.getWidth()/2,this.getHeight()/2, 100, 100, Color.blue,this);
                super.paint(g);
            }
        };

        final JFrame frame = new JFrame();

        frame.add(component);
        frame.setSize(100, 100);

        frame.pack();
        frame.setVisible(true);
    }

}

Это создает пустое окно, размер которого, похоже, не равен 100,100.Есть ли какой-то другой шаг, который мне нужно выполнить, чтобы графика отображалась на экране, или размер, который нужно соблюдать?

Я использую JDK6 на OSX 10.6

Ответы [ 2 ]

2 голосов
/ 04 августа 2010

Попробуйте это:

public class ImageApp {

    public static void main(String[] args) throws MalformedURLException, IOException {
        final Image image = ImageIO.read(new File("/Library/WebServer/Documents/image.gif"));

        final JPanel component = new JPanel() {

            @Override
            public void paintComponent(final Graphics g) {
                super.paintComponent(g);
                System.out.println("Drawing image " + image.getWidth(null) + " " + image.getHeight(null));
                g.drawString("hello", 0,10);
                g.drawImage(image, this.getWidth() / 2, this.getHeight() / 2, 100, 100, Color.blue, this);
            }
        };

        final JFrame frame = new JFrame();

        frame.add(component);
        frame.setSize(100, 100);

        frame.setVisible(true);
    }
}
2 голосов
/ 04 августа 2010

В Swing вы должны переопределить paintComponent(), а не paint().

Приложение: например, см. Ниже. В комментарии @eugener поднимает вопрос об использовании JLabel в качестве альтернативного контейнера изображений .

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageApp {

    public static void main(String[] args) throws IOException {
        final Image image = ImageIO.read(new File("image.jpg"));
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                final JPanel component = new JPanel() {

                    @Override
                    public void paintComponent(final Graphics g) {
                        g.drawImage(image, 0, 0, null);
                    }

                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(
                            image.getWidth(this), image.getHeight(this));
                    }
                };

                final JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(component);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...