Обновление картинки в DrawingPanel расширяет JPanel - PullRequest
1 голос
/ 02 августа 2011

Мне нужно загрузить маленькую иконку на кнопку моего программного обеспечения.просто чтобы иконка загрузки / ок / ошибка.как указано в "http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter06/images.html", я создаю панель расширения, расширяющую JPanel.

class drawingPanel extends JPanel
{
    Image img;

    drawingPanel (Image img){
        this.img = img;
    }

    public void paintComponent (Graphics g) {
        super.paintComponent (g);

        // Use the image width & height to find the starting point
        int imgX = getSize ().width/2 - img.getWidth (this);
        int imgY = getSize ().height/2 - img.getHeight (this);

        //Draw image centered in the middle of the panel    
        g.drawImage (img, imgX, imgY, this);
    } // paintComponent

}

Я инициализирую компонент следующим образом:

// Grab the image.
Image img = new ImageIcon(iconPath+"ok.png").getImage();
// Create an instance of DrawingPanel
iconPanel = new drawingPanel(img);

все работает хорошо, но во время выполнения я хочучтобы иметь возможность изменить значок в панели. Я попробовал все fo; llowing, но ни один не смог просмотреть новую картинку:

Image img = new ImageIcon(iconPath+"loading.gif").getImage();
// Create a new  instance of DrawingPanel
this.iconPanel = new drawingPanel(img);
this.iconPanel.repaint();
this.iconPanel.revalidate();
this.iconPanel.repaint();
this.repaint();
this.revalidate();

(я пробовал это, потому что класс, в котором я пишу кодеще одно расширение JPanel, которое содержит IconPanel. Есть идеи, почему мне не удается изменить изображение?

Спасибо, Стефано

1 Ответ

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

Во-первых, не начинайте имя класса с маленького имени.Переименуйте drawingPanel в DrawingPanel.

Я попытался сделать простую демонстрацию на основе вашего описания, и она отлично работает.Изображение на панели отлично меняется.

public class Demo {

    public Demo() {
        JFrame frame = new JFrame();
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());

        // Grab the image.
        Image img = new ImageIcon("1.png").getImage();
        // Create an instance of DrawingPanel
        final DrawingPanel iconPanel = new DrawingPanel(img);

        frame.add(iconPanel, BorderLayout.CENTER);

        JButton button = new JButton("Change image..");
        frame.add(button, BorderLayout.NORTH);

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                iconPanel.setImg(new ImageIcon("2.png").getImage());
                iconPanel.repaint();
            }
        });

        frame.setVisible(true);
    }

    public static void main(String[] args){
        new Demo();
    }
}

class DrawingPanel extends JPanel {
    Image img;

    DrawingPanel(Image img) {
        this.img = img;
    }

    public void setImg(Image img) {
        this.img = img;
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        // Use the image width & height to find the starting point
        int imgX = getSize().width / 2 - img.getWidth(this);
        int imgY = getSize().height / 2 - img.getHeight(this);

        // Draw image centered in the middle of the panel
        g.drawImage(img, imgX, imgY, this);
    } // paintComponent

}

Внесенные мной изменения - это добавление метода установки img в класс DrawingPanel.Поэтому вместо создания нового DrawingPanel вам просто нужно вызвать setImg () с новым Image, а затем вызвать reapint, чтобы нарисовать новое изображение.

...