java - 图像未按计划显示,我正在尝试使用 JLabel 更改 JFrame 中的图像

标签 java swing jframe jlabel imageicon

我的代码是

JFrame frame=new JFrame("Change pic");
ImageIcon image=new ImageIcon("image.jpg");
ImageIcon image1=new ImageIcon("image1.jpg");
frame.setSize(image.getIconWidth(),image.getIconHeight());
frame.add(new JLabel(image));
Thread.sleep(3000);
frame.add(new JLabel(image1));
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

使用上述代码时,第一个图像(“image”)不会出现,只出现第二个图像(“image 2”)。即使不使用 Thread.sleep(3000) 行,它也会给出相同的结果。 但是当我将代码编写为

JFrame frame=new JFrame("Change pic");
ImageIcon image=new ImageIcon("image.jpg");
ImageIcon image1=new ImageIcon("image1.jpg");
frame.setSize(image.getIconWidth(),image.getIconHeight());
frame.add(new JLabel(image));
frame.setVisible(true);
Thread.sleep(3000);
frame.add(new JLabel(image1));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

然后第一个图像(“image”)出现在第二个图像(“image1”)之上,当我将框架向右延伸时我只能看到第二个图像?

所以我的问题是为什么对于第二个代码,第一个图像(“图像”)出现在顶部?我需要进行哪些更改才能使第二个图像(“image1”)在 3 秒后替换第一个图像(“image”)?

抱歉,如果这个问题很愚蠢。任何帮助将不胜感激。 实际上,我正在尝试开发一个远程桌面共享应用程序,但我被困在这里。

最佳答案

  1. JFrame 有一个默认的 BorderLayout。添加组件而不指定 BorderLayout 位置会自动将其添加到 BorderLayout.CENTER。每个位置只能有一个组成部分。您添加的最后一个组件将是唯一可见的。查看更多How to Use BorderLayout

  2. 避免使用Thread.sleep。如果您想要动画,请使用javax.swing.Timer。查看更多How to use Swing Timers 。使用这个方法,你可以做这样的事情

    JLabel iconLabel = new JLabel(image);
    ...
    Timer timer = new Timer(3000, new ActionListener(){
         public void actionPerformed(ActionEvent e) {
             iconLabel.setIcon(image1);
         }
    }); 
    timer.setRepeats(false);
    timer.start();
    

    无需尝试添加新标签,只需更改图标即可。

  3. 也不要设置框架的大小。只需打包即可。图像将为您设置 JLabel 的首选大小,并且打包框架将确保图标完全可见。

顺便说一句,当您在容器可见之后添加组件时,您需要对容器进行 revalidate()repaint() .

<小时/>

尝试运行此示例。只需输入图像图标的路径即可。

import java.awt.event.*;
import javax.swing.*;

public class ChangeIcon {

    public ChangeIcon() {
        final ImageIcon image = new ImageIcon("image.jpg");
        final ImageIcon image1 = new ImageIcon("image1.jpg");
        final JLabel iconLabel = new JLabel(image);

        Timer timer = new Timer(3000, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                iconLabel.setIcon(image1);
            }
        });
        timer.setRepeats(false);
        timer.start();

        JFrame frame = new JFrame();
        frame.add(iconLabel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new ChangeIcon();
            }
        });
    }
}

关于java - 图像未按计划显示,我正在尝试使用 JLabel 更改 JFrame 中的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22519939/

相关文章:

java - JFrame 添加文本不起作用。出现两个GUI

java - 关于mt ListView中画行的咨询

java - Maven 多模块项目生命周期

Java - 将图像添加到 JButton

java - JApplet 将启动但未初始化

java - 使用 mvc 时将在不同类上创建的 jpanel 添加到主视图页面

java - 保护应用程序不被从一台 PC 复制到另一台 PC

java - 在 univocity csv 解析器中转义定界字符

java - 为什么 GroupLayout 中的链接组件无法调整大小?

java - 我正在阅读 Head First Java,但我对这个程序感到困惑