当我点击下一个按钮时,我正在尝试制作在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;
}
}
});
}
}
答案 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)
{
}