当使用JavaSwing单击next按钮时,图像不会显示在JLabel上
我试图制作一个小程序,当用户单击下一步按钮时,在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
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;-如果您不相信,请随时查看问题的历史记录:。停止交叉发布!!!花时间回答一个问题,却发现已经给出了完全相同的答案,而你却懒得回复说已经找到了答案,这很烦人。是的,我在那里发了帖子,但没有得到答案。即使从现在起,也没有人回复。那个么在另一个论坛提问有什么错呢?但我并没有得到答案——是的,你们得到了答案。我回答。在另一个论坛提问有什么不对-你读过我的评论吗???在另一个论坛上,你得到了答案,而你却懒得回复,所以我浪费了时间帮助你,而我本可以花时间帮助其他没有答案的人。这就是问题所在,当你在两个论坛上发帖时。你从来都懒得回复其他论坛,说你有答案。是的,我只是在那里查了一下,你回复了。谢谢。不要在这里感谢我。谢谢你。回复说明答案确实解决了问题,以便阅读问题的其他人可以从答案中学习。或者发表评论说你在其他论坛上找到了解决方案?可能有人读了这个问题,认为你还在寻找答案,而浪费他们的时间试图提供另一个答案。为那些自愿抽出时间回答问题的人着想。当你问问题时,无论你问到哪里,都要跟进!!!