图像没有按计划显示,我尝试使用JLabel更改JFrame中的图像

时间:2014-03-19 22:57:06

标签: 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);

使用上述代码时,不会出现第一张图像(“图像”),只会出现第二张图像(“图像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);

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

所以我的问题是为什么第二个代码第一个图像(“图像”)出现在顶部?我必须做出哪些更改才能使第二张图像(“image1”)在3秒后替换第一张图像(“图像”)?

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

1 个答案:

答案 0 :(得分:3)

  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的首选尺寸,pack框架将确保图标完全可见。

  4. 另外,当您在之后添加组件时,容器可见,您需要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();
                }
            });
        }
    }