4

我正在使用 JLabel 在 JFrame 中显示图像并设置它的图标。

它第一次工作,但是每当我去更改图像时,它仍然是我第一次设置的,所以我尝试了这个并且仍然是相同的结果。

                contentPane.remove(lblPlaceholder);
            lblPlaceholder = null;
            lblPlaceholder = new JLabel("");
            lblPlaceholder.setBounds(10, 322, 125, 32);
            contentPane.add(lblPlaceholder);
            lblPlaceholder.setIcon(new ImageIcon("tempimage.png"));

我怎样才能让它改变它的形象?我也尝试过重新绘制 JFrame,但没有任何结果。

4

3 回答 3

6

对我来说很好。我认为您的代码中还有其他内容您没有共享。SSCCE有助于澄清其他问题。

根据您提供的一些建议...

  • 避免null布局(看起来你可能正在使用一个)
  • 避免setBounds

在此处输入图像描述在此处输入图像描述

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ShowLabelImage {

    public static void main(String[] args) {
        new ShowLabelImage();
    }

    private JLabel label;

    private List<BufferedImage> images;
    private int currentPic = 0;

    public ShowLabelImage() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                images = new ArrayList<>(2);
                try {
                    images.add(ImageIO.read(new File("path/to/pic1")));
                    images.add(ImageIO.read(new File("path/to/pic2")));
                } catch (IOException exp) {
                    exp.printStackTrace();
                }

                label = new JLabel();
                label.setHorizontalAlignment(JLabel.CENTER);
                label.setVerticalAlignment(JLabel.CENTER);

                JButton switchPic = new JButton("Switch");
                switchPic.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        currentPic++;
                        if (currentPic >= images.size()) {
                            currentPic = 0;
                        }
                        label.setIcon(new ImageIcon(images.get(currentPic)));
                    }
                });

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(label);
                frame.add(switchPic, BorderLayout.SOUTH);
                switchPic.doClick();
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}
于 2013-07-05T03:56:21.450 回答
6

没有必要创建一个新标签,它可能会阻碍事情。

改变:

            contentPane.remove(lblPlaceholder);
        lblPlaceholder = null;
        lblPlaceholder = new JLabel("");
        lblPlaceholder.setBounds(10, 322, 125, 32);
        contentPane.add(lblPlaceholder);
        lblPlaceholder.setIcon(new ImageIcon("tempimage.png"));

到:

        lblPlaceholder.setIcon(new ImageIcon("tempimage.png"));

另请参阅此工作示例

更多提示

  • Java GUI 可能必须在多个平台、不同的屏幕分辨率和使用不同的 PLAF 上工作。因此,它们不利于组件的精确放置。要为强大的 GUI 组织组件,请改为使用布局管理器或它们的组合,以及用于空白空间的布局填充和边框。EG 上面的 GUI 使用 aGridBagLayout将图像置于JScrollPane.
  • 对于布局的帮助,请提供 GUI 的 ASCII 艺术,因为它应该以最小的尺寸出现,并且(如果可调整大小)具有额外的宽度/高度。
  • 为了尽快获得更好的帮助,请发布SSCCE
于 2013-07-05T04:03:13.357 回答
0

如果您查看 ImageIcon 构造函数,您会看到它使用此方法加载图标:此方法image = Toolkit.getDefaultToolkit().getImage(location); 的文档说:

 * Returns an image which gets pixel data from the specified URL.
 * The pixel data referenced by the specified URL must be in one
 * of the following formats: GIF, JPEG or PNG.
 * The underlying toolkit attempts to resolve multiple requests
 * with the same URL to the same returned Image.

要在每次从相同的文件名加载 ImageIcon 时刷新它,您应该在 URL 的末尾添加一些随机的内容,而不更改实际的文件名。像这样的东西应该工作:

      try {
        URL url = new URL(file.toURI().toString() 
        + "?" + System.currentTimeMillis());
        jLabel1.setIcon(new ImageIcon(url));
      } catch (MalformedURLException ex) {
        ex.printStackTrace();
      }
于 2017-12-27T02:43:31.040 回答