使用 java Swing 单击下一步按钮时图像不显示在 JLabel 上

image doesnt shows on JLabel when click on next button, using java Swing

我正在尝试制作一个小程序,当用户单击“下一步”时在 JLabel 上显示图片 Button.The 问题是当我单击“下一步”按钮时它会显示 nothing.but 如果我调整框架大小它会显示所有图片从目录。而不是一次一张图片。 请原谅我的英语。 这是我的代码。

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().add(image);

之后添加frame.revalidate()frame.repaint()

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

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

added as you suggested . now it shows next image on frame along with prevous image. but i wants 1 image at a time

然后删除第一张图片,或者更好的是,与其每次都创建一个新的 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)
{
}