【问题标题】:image doesnt shows on JLabel when click on next button, using java Swing使用 java Swing 单击下一步按钮时,图像不会显示在 JLabel 上
【发布时间】:2015-06-13 09:22:45
【问题描述】:

我正在尝试制作一个小程序,当用户单击下一个按钮时在 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;

                }
            }
        });
    }
}

【问题讨论】:

  • 交叉发布:coderanch.com/t/651201/GUI/java/Image-doesnt-shows-propely-java。放弃交叉发帖!!!花时间回答一个问题却发现已经给出了完全相同的答案,而您却懒得回答说已经找到答案,这很烦人。
  • 是的,我在那里发帖,但我没有得到答案。即使现在没有人回复了。那么在另一个论坛提问有什么问题。
  • but i didn't get answer - 是的,你做到了。我回答了。 whats wrong in ask questions in another forum - 你有没有看我的评论???你没有费心在其他论坛上回复你得到了答案,所以当我本可以花时间帮助其他没有问题答案的人时,我浪费了时间来帮助你。当您在两个论坛上发帖时,这就是问题所在。你永远不会费心回复其他论坛说你有答案。
  • 是的,我刚刚检查过你回复了。谢谢
  • 不要在这里感谢我。在那里谢谢我。回复说答案确实解决了问题,因此阅读该问题的其他人可以从答案中学习。或者发表评论说您在其他论坛中找到了解决方案?可能其他人可能会阅读该问题并认为您仍在寻找答案并浪费时间试图提供另一个答案。体谅那些自愿花时间回答问题的人。当您提出问题时,请在任何地方提出问题!!!

标签: java swing jlabel imageicon


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 请有人指出拒绝投票的原因?
  • 或者使用 SwingUtilities SwingUtilities.updateComponentTreeUI(Component);方法
  • @jordandap 哦,天哪,不,永远不会,如果你建议使用updateUI,这个建议只会更糟,这些方法与重新验证组件布局无关,而是与重新验证外观和感觉代表设置,这是非常低效的。 revalidate 在它的更新过程中是有选择性的,寻找之前被标记为无效的容器并跳过那些没有改变并且不会受到所做更改影响的容器。 invaidatevalidate(也很简单)revalidate 是更好的选择
  • 我按照你的建议添加了。现在它在帧上显示下一个图像以及上一个图像。但我一次想要一张图片
  • @PreetSingh 然后删除第一个图像,或者更好的是,不是每次都创建一个新的JLabel,而是创建一个JLabel,然后简单地更改它的图标属性,这应该会自动使容器失效
【解决方案2】:

在您的 ActionListener for next 中,您需要删除以前的标签,然后添加新标签

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

【讨论】:

  • 哇,真的,就像我 8 分钟前所说的那样,绝对不会猜到
  • @MadProgrammer 哇真的吗?那是 5 分钟前,大约 30 秒前我发布了这个。在我发布之前我什至没有看到你的编辑
  • “在我发布这篇文章之前大约 30 秒” - 那么为什么不添加任何新内容而只是重复已经说过的话?
  • 您在 13 分钟前发布,但在 5 分钟前编辑。 5分钟前你添加的和我说的一样。而且我在发布之前没有看到您的编辑。
  • 其实原帖里写着“在frame.getContentPane().add(image)之后添加frame.revalidate()和frame.repaint();” - 随意如果您不相信我,请检查问题的历史记录
猜你喜欢
  • 1970-01-01
  • 2021-07-29
  • 2014-05-15
  • 2013-10-12
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
相关资源
最近更新 更多