Изменить изображение в JFrame? - PullRequest
2 голосов
/ 28 ноября 2011

Я работал над учебником по Oracle для изображений, здесь:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

public class LoadImageApp extends Component {

    BufferedImage img;

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

    public LoadImageApp() {
       try {
           img = ImageIO.read(new File("strawberry.jpg"));
       } catch (IOException e) {
       }

    }

    public Dimension getPreferredSize() {
        if (img == null) {
             return new Dimension(100,100);
        } else {
           return new Dimension(img.getWidth(null), img.getHeight(null));
       }
    }

    public static void main(String[] args) {

        JFrame f = new JFrame("Load Image Sample");

        f.addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });

        f.add(new LoadImageApp());
        f.pack();
        f.setVisible(true);
    }
}

Я хочу изменить изображение, которое появляется в JFrame.Если я скажу:

f.add(new LoadImageApp());      
f.revalidate();
f.repaint();

Новое изображение появится за текущим.Что я хотел бы сделать, это удалить предыдущее изображение и заменить, но я не могу понять, как мне поступить с этим фрагментом кода?

Ответы [ 3 ]

5 голосов
/ 28 ноября 2011

Почему бы вам просто не использовать JLabel для отображения изображения? Затем, чтобы изменить изображение, вы просто вызываете метод setIcon (...).

Если вам нужно сделать заказную покраску, то:

  1. Для приложений Swing вы должны расширить JComponent, а не Component

  2. Вы должны переопределять paintComponent (), а не paint ()

  3. Если вы хотите изменить изображение, создайте метод, такой как setImage(), чтобы изменить изображение. Затем в этом методе вы вызываете repaint (), чтобы заставить компонент перерисовать себя. Нет необходимости создавать новый компонент и заменять его в графическом интерфейсе.

0 голосов
/ 18 февраля 2017

Вот мой вклад, с основным для тестирования. Идея состоит в том, чтобы изменить базовую JPanel, где снимается изображение. Этот класс может быть добавлен в другой JPanel или JFrame, и все же у вас будет доступ к изменению изображения.

public class ImageButton extends JPanel {


    public  JLabel imageLabel;

    public ImageButton() {
        super();
        iniGUI();
    }


    private void iniGUI() {

        JPanel panel = new JPanel();
        imageLabel = new JLabel(" ");
        panel.setLayout(new BorderLayout());
        panel.add(imageLabel, BorderLayout.NORTH);

        JButton clickButton = new JButton("Select...");
        panel.add(clickButton, BorderLayout.SOUTH);

        clickButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                JFileChooser fc = new JFileChooser();
                int result = fc.showOpenDialog(null);
                if (result == JFileChooser.APPROVE_OPTION) {
                    File file = fc.getSelectedFile();
                    try {
                        imageLabel.setIcon(new ImageIcon(ImageIO.read(file)));
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        panel.setPreferredSize(new Dimension(200, 200));
        panel.setBorder(BorderFactory.createLineBorder(Color.black));

        this.add(panel, BorderLayout.CENTER);


    }



    public static void main(String...arg){

        JFrame cadre = new javax.swing.JFrame(" ");

        cadre.setContentPane(new  ImageButton());
        cadre.setPreferredSize(new Dimension(600, 600));
        cadre.setLocation(300, 300);
        cadre.pack();
        cadre.setVisible(true);
        cadre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }



}
0 голосов
/ 28 ноября 2011

Проблема в том, что вы складываете изображения, не удаляя старые. Сделайте следующее вместо этого: В оригинальном коде:

BufferedImage img = new LoadImageApp();
f.add(img);
f.pack();
f.setVisible(true);

Когда вы хотите загрузить другое изображение:

img = new LoadImageApp();
// No need to add the image to the frame again, just refresh
f.repaint();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...