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

时间:2015-06-13 09:22:46

标签: 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.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;

                }
            }
        });
    }
}

2 个答案:

答案 0 :(得分:4)

frame.revalidate()

之后添加frame.repaint()frame.getContentPane().add(image);

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

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

  

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

然后删除第一张图片,或者更好的是,不是每次都创建一个新的JLabel,而是创建一个JLabel并简单地更改它的icon属性,这会使容器无效自动

答案 1 :(得分:0)

在你的ActionListener中,您需要删除上一个Label然后添加新标签

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)
{
}