当使用JavaSwing单击next按钮时,图像不会显示在JLabel上

当使用JavaSwing单击next按钮时,图像不会显示在JLabel上,java,swing,jlabel,imageicon,Java,Swing,Jlabel,Imageicon,我试图制作一个小程序,当用户单击下一步按钮时,在JLabel上显示图片。问题是当我单击下一步按钮时,它什么也不显示。但如果我调整框架大小,它将显示目录中的所有图片。而不是一次只拍一张照片。 请原谅我的英语。 这是我的密码 import java.awt.*; import javax.swing.*; import java.awt.event.*; import javax.imageio.ImageIO; import java.io.*; import java.awt.image.Buf

我试图制作一个小程序,当用户单击下一步按钮时,在JLabel上显示图片。问题是当我单击下一步按钮时,它什么也不显示。但如果我调整框架大小,它将显示目录中的所有图片。而不是一次只拍一张照片。 请原谅我的英语。 这是我的密码

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

class test {
    public static void main(String args[]) {
        frame f = new frame();
        f.gui();
        f.actions();
    }
}

class frame {

    BufferedImage file;
    File img;
    ImageIcon icon;

    JLabel image;
    JFrame frame;
    JPanel panel;
    String[] path = { "juice.jpg", "gal.jpg", "truck.jpg", "Drive.jpg" };

    JButton next = new JButton("NEXT");
    JButton pre = new JButton("PREVOIUS");
    JTextField field = new JTextField(10);

    static int num = 0;

    public void gui() {

        frame = new JFrame("pic gallery");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        FlowLayout flow = new FlowLayout();
        frame.setLayout(flow);
        panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
        panel.add(next);
        panel.add(pre);
        panel.add(field);

        JLabel piclabel = new JLabel();

        frame.getContentPane().add(panel);
    }

    void actions() {

        next.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                img = new File(path[num]);
                System.out.println(num);
                try {
                    file = ImageIO.read(img);
                    icon = new ImageIcon(file);
                    image = new JLabel("", icon, JLabel.CENTER);

                    image.setVisible(true);
                    frame.getContentPane().add(image);

                } catch (IOException g) {

                }
                if (num < path.length - 1) {
                    num++;
                    field.setText(num + "");

                } else {
                    num = 0;

                }
            }
        });
    }
}
在frame.getContentPane.addimage之后添加frame.revalidate和frame.repaint

Swing在执行布局层次结构的更新时是懒惰的,这是一件好事,想象一下添加几十个组件并为每个组件更新整个组件层次结构

因此,您需要在进行更改时手动更新容器

按照你的建议添加。现在,它将在帧上显示下一个图像以及上一个图像。但我一次只想要一张照片


然后删除第一个映像,或者更好,不是每次都创建一个新的JLabel,而是创建一个JLabel并简单地更改它的icon属性,这将使ActionListener中的容器自动失效。下一步,您需要删除以前的标签,然后添加新标签

try
{
     file = ImageIO.read(img);
     icon = new ImageIcon(file);
     if(image != null) frame.remove(image);
     image = new JLabel("", icon, SwingConstants.CENTER);

     image.setVisible(true);
     frame.getContentPane().add(image);
     frame.revalidate();
     frame.repaint();
}
catch (IOException g)
{
}

请有人指出否决票的原因?或使用SwingUtilities SwingUtilities.UpdateComponent TreeUIComponent;method@jordandap哦,拜托,亲爱的上帝,不,永远不会,如果你建议使用updateUI,这个建议只会更糟,这些方法与重新验证组件布局无关,而是与重新验证外观和感觉代理设置有关,这是非常低效的。重新验证在其更新过程中是有选择性的,寻找以前被标记为无效的容器,并跳过那些未更改且不会受到所做更改影响的容器。根据您的建议,我添加了invaidate、validate和revalidate。现在,它将在帧上显示下一个图像以及上一个图像。但我一次只想要一张照片time@PreetSingh然后删除第一个映像,或者更好,不是每次都创建一个新的JLabel,而是创建一个JLabel并简单地更改它的icon属性,这会自动使容器无效。正如我8分钟前所说的,这是永远不会有的guessed@MadProgrammer哇,真的吗?这是5分钟前,大约30秒前,我发布了这个。在我发布这篇文章之前,我甚至没有看到你的编辑,在我发布这篇文章之前大约30秒,所以为什么不添加任何新内容,而只是重复已经说过的内容呢?你在13分钟前发布,但在5分钟前编辑过。5分钟前你加了和我说的一样的。在发布之前,我还没有看到您的编辑。实际上,最初的帖子是Add frame.revalidate和frame.repaint after frame.getContentPane.addimage;-如果您不相信,请随时查看问题的历史记录:。停止交叉发布!!!花时间回答一个问题,却发现已经给出了完全相同的答案,而你却懒得回复说已经找到了答案,这很烦人。是的,我在那里发了帖子,但没有得到答案。即使从现在起,也没有人回复。那个么在另一个论坛提问有什么错呢?但我并没有得到答案——是的,你们得到了答案。我回答。在另一个论坛提问有什么不对-你读过我的评论吗???在另一个论坛上,你得到了答案,而你却懒得回复,所以我浪费了时间帮助你,而我本可以花时间帮助其他没有答案的人。这就是问题所在,当你在两个论坛上发帖时。你从来都懒得回复其他论坛,说你有答案。是的,我只是在那里查了一下,你回复了。谢谢。不要在这里感谢我。谢谢你。回复说明答案确实解决了问题,以便阅读问题的其他人可以从答案中学习。或者发表评论说你在其他论坛上找到了解决方案?可能有人读了这个问题,认为你还在寻找答案,而浪费他们的时间试图提供另一个答案。为那些自愿抽出时间回答问题的人着想。当你问问题时,无论你问到哪里,都要跟进!!!