繁体   English   中英

使用Timer在JLabel中更改ImageIcon

[英]Change ImageIcon in JLabel using Timer

我有两个类:逻辑和JFrame 在框架中,我有一个JLabel和一个JButton ,我想:

单击此按钮后,标签中的ImageIcon在确定的时间后使用Swing Timer ,就像它正在闪烁一样。 为此,我加载了两个亮度不同的图像( img1bimg1 )。 我试图使计时器以不同的延迟两次更改图像,但未成功。 我还在按钮中放置了一个侦听器,并实现了actionPerformed ,如下所示:

public void actionPerformed(ActionEvent e) {
    if(e.getSource().equals(btnImg1)) {
        logic.piscaImagen(img1, lblImg1);
        logic.piscaImagen(img1b, lblImg1);

在逻辑课中:

public void piscaImagen(ImageIcon img, JLabel lbl) {

        Timer timer = new Timer(1250, null);
        timer.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt){
                if(lbl.getIcon() != img){
                    lbl.setIcon(img);
            }
        }
        });
        timer.setRepeats(false);
        timer.start();
}

但是,当我运行它时, logic.piscaImagen没有任何变化。 有小费吗?

logic.piscaImagen(img1, lblImg1);
logic.piscaImagen(img1b, lblImg1);

在我看来,您正在启动两个计时器。 因此,第一个计时器触发并更改图像,然后第二个计时器触发并恢复图像,因此基本上您只能看到第一个图像。

您只需要一个计时器。 每次定时器触发时,您都会更改图像。 因此,Timer中的基本代码为:

if (lbl.getIcon() == img1)
    lbl.setIcon(img1b);
else
    lbl.setIcon(img1);

或者,对于更灵活的解决方案,您可以使用Animated Icon

Animated Icon将允许您指定要显示的图标列表。 然后,当计时器触发时,将显示列表中的下一个图标。 您可以将Animated Icon设置为连续显示,也可以控制循环数。

编辑 :回答不准确,不需要repaint() -请参阅注释。


您错过了告诉程序需要更新显示的repaint()调用。

@Override
public void actionPerformed(ActionEvent evt) {
    if(lbl.getIcon() != img){ 
        lbl.setIcon(img);
        lbl.repaint();
    }
}

if您的语句也缺少右括号,则不确定会产生什么影响/如果是错字)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM