簡體   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