Как правильно использовать repaint() и revalidate()?

#java #jpanel

#java #jpanel

Вопрос:

Я новичок в JPanel и не совсем понимаю, как его сбросить. Как только изображение выбрано, и пользователь хочет выбрать новое, я хочу, чтобы оно стерло старое выбранное изображение и вставило новое. Но я не уверен, как это сделать. Я видел repaint() и revalidate() использовал, но я явно не знаю, как это использовать. Итак, как мне это сделать?

 import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JRadioButtonMenuItem;

public class Menu extends JFrame {
    JMenuBar menuBar;
    ButtonGroup pictureGroup, problemsGroup;
    BufferedImage picture1img, picture2img, picture3img;
    JMenu choiceOfThreePictures, numberOfProblems;
    JRadioButtonMenuItem picture1, picture2, picture3, fourProblems, nineProblems, sixteenProblems;
    // /Users/Administrator/Dropbox/Java/HW6Wilson/HW6Wilson/Picture1.jpg
    // /Users/Administrator/Dropbox/Java/HW6Wilson/HW6Wilson/Picture2.png
    // /Users/Administrator/Dropbox/Java/HW6Wilson/HW6Wilson/Picture3.jpg

    public Menu() {
        // Create the menu bar.
        menuBar = new JMenuBar();
        setJMenuBar(menuBar);

        // Create Picture choices on Menu Bar
        choiceOfThreePictures = new JMenu("Picture Choices");
        // Add Picture choices on Menu Bar
        menuBar.add(choiceOfThreePictures);
        // Create MenuItems onto Picture choices
        pictureGroup = new ButtonGroup();
        picture1 = new JRadioButtonMenuItem("Picture 1");
        picture2 = new JRadioButtonMenuItem("Picture 2");
        picture3 = new JRadioButtonMenuItem("Picture 3");
        // Add Picture Choices to Picutre choices menu
        choiceOfThreePictures.add(picture1);
        pictureGroup.add(picture1);
        choiceOfThreePictures.add(picture2);
        pictureGroup.add(picture2);
        choiceOfThreePictures.add(picture3);
        pictureGroup.add(picture3);

        // Create Number Of Problems on Menu Bar
        numberOfProblems = new JMenu("Number Of Problems");
        // Add Number Of problems on Menu Bar
        menuBar.add(numberOfProblems);
        // Create Menu Items onto Number Of problems
        problemsGroup = new ButtonGroup();
        fourProblems = new JRadioButtonMenuItem("4");
        nineProblems = new JRadioButtonMenuItem("9");
        sixteenProblems = new JRadioButtonMenuItem("16");
        // Add Number Of problems onto menu
        numberOfProblems.add(fourProblems);
        problemsGroup.add(fourProblems);
        numberOfProblems.add(nineProblems);
        problemsGroup.add(nineProblems);
        numberOfProblems.add(sixteenProblems);
        problemsGroup.add(sixteenProblems);

        // Start creating ActionListeners
        picture1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.out.println("Working");
                try {
                    picture1img = ImageIO.read(new File("/Users/Administrator/Dropbox/Java/HW6Wilson/HW6Wilson/Picture1.jpg"));
                    getContentPane().add(new JLabel(new ImageIcon(picture1img)));
                    revalidate();
                    repaint();
                    setVisible(true);

                } catch (IOException e) {
                    System.out.println("Couldn't find image.");
                }
            }
        });
        picture2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.out.println("Working");
                try {
                    picture2img = ImageIO.read(new File("/Users/Administrator/Dropbox/Java/HW6Wilson/HW6Wilson/Picture2.jpg"));
                    getContentPane().add(new JLabel(new ImageIcon(picture2img)));
                    revalidate();
                    repaint();
                    setVisible(true);
                } catch (IOException e) {
                    System.out.println("Couldn't find image.");
                }
            }
        });
        picture3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.out.println("Working");
                try {
                    picture3img = ImageIO.read(new File("/Users/Administrator/Dropbox/Java/HW6Wilson/HW6Wilson/Picture3.jpg"));
                    getContentPane().add(new JLabel(new ImageIcon(picture3img)));
                    revalidate();
                    repaint();
                    setVisible(true);

                } catch (IOException e) {
                    System.out.println("Couldn't find image.");
                }
            }
        });
    }

    public static void main(String[] args) {
        Menu mb = new Menu();
        mb.setSize(900, 700);
        mb.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mb.setVisible(true);
    }
}
  

Ответ №1:

Вы используете его просто отлично, вы даже можете выполнять удаленный repaint() вызов, поскольку revalidate более чем достаточно. Проблема в том, что вы добавляете новые изображения, но не удаляете ранее добавленные изображения из contentPane , поэтому он не переключается.

Так что, если вы

                     picture3img = ImageIO.read(new File("/Users/Administrator/Dropbox/Java/HW6Wilson/HW6Wilson/Picture3.jpg"));
                    getContentPane().removeAll(); // HERE IS IMPORTANT PART
                    getContentPane().add(new JLabel(new ImageIcon(picture3img)));
                    revalidate();
  

Это будет работать

Лучшим подходом было бы использовать одну метку в качестве «отображения изображения» и использовать setIcon(icon) JLabel вместо изменения целых меток.

Комментарии:

1. Большое вам спасибо! Я потратил так много времени на то, чтобы разобраться с этим.