Отображение изображения JFrame при изменении размера кадра - PullRequest
0 голосов
/ 06 июля 2011

У меня есть этот JFrame, содержащий дочерние элементы JPanel, в котором он отображает изображение, которое объявлено таким образом.

BufferedImage image = ImageIO.read(filename);

Программа правильно отображает изображение. Но единственное, что для отображения изображения требуется изменить размер рамки.

Можно ли отобразить изображение после появления рамки?

Ответы [ 2 ]

3 голосов
/ 06 июля 2011

Вы должны переопределить paintComponent(Graphics g) и нарисовать изображение там. В этом случае вы должны сделать это для компонента JPanel (я думаю? Если нет, то сделать это для JComponent (s), на которые вы ссылаетесь). Кроме того, поскольку Swing не является потокобезопасным, убедитесь, что эти изменения выполнены в EDT.

Пример

public class Demo{
    private static BufferedImage bi;

    public static void main(String[] args){
        try{
            loadImage();

            SwingUtilities.invokeLater(new Runnable(){
                @Override
                public void run(){
                    createAndShowGUI();
                }
            });
        }
        catch (IOException e){
            // handle exception
        }
    }

    private static void loadImage() throws IOException{
        bi = ImageIO.read(new File("src/resource/braveheart.PNG"));
    }

    private static void createAndShowGUI(){
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JPanel panel = new JPanel(){
            @Override
            protected void paintComponent(Graphics g){
                Graphics g2 = g.create();
                g2.drawImage(bi, 0, 0, getWidth(), getHeight(), null);
                g2.dispose();
            }

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

        frame.add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

OUTPUT

enter image description here

Важно помнить, что в этом примере игнорируются подсказки при рендеринге, поэтому при максимизации JFrame качество изображения будет очень плохим. :)

EDIT

Отвечая на этот вопрос, я предположил, что у вас есть базовое понимание свинга. Я полагаю, я взял на себя слишком много. Важно отметить, что все компоненты должны быть добавлены в контейнер верхнего уровня до того, как он будет реализован (то есть сделан видимым). Это гарантирует, что все отображается без изменения размера вашего кадра. Как и предполагали другие, вы могли бы просто использовать JLabel для рендеринга изображения, а затем добавить его в JPanel. Вместо этого я продвинул заказную живопись, которая совершенно приемлема, и для меня, более чистая.

1 голос
/ 06 июля 2011

для отображения Изображение или ImageIcon лучше искать для JLabel (базовый материал)

...