簡體   English   中英

Java-Swing:ImageIcon無法在運行時更改?

[英]Java-Swing : The ImageIcon cannot change in runtime?

我在java中有這段代碼

private void buttonShowImageActionPerformed(java.awt.event.ActionEvent evt)
{
    if(folderFiles != null)
    {
        for(int i=0; i<folderFiles.size(); i++)
        {
            icon = new ImageIcon(folderFiles.get(i));
            labelImage.setIcon(icon);
            timeDelay(2);      // A method that delays 2 secs - it works
        }
    }
}

當我按下按鈕時,它會等待一段時間,從第一張開始到最后一張圖像,然后逐個跳過文件夾中的圖像。延遲方法有效(我已經測試過)謝謝!

關於:

純滯后(2); //延遲2秒的方法-它有效

不,無論您如何測試,它都行不通。 Swing不能那樣工作,您最好避免做出這樣的假設。 使用搖擺計時器。

您會問,我怎么知道它不起作用,我會告訴您:該代碼不會調用后台線程,也不會啟動Swing Timer,因此它唯一能做的就是延遲當前時間。線程,可能在某個地方帶有Thread.sleep(...) 如果您對此進行調用並“測試”,是的,這將導致延遲,這些延遲將顯示在控制台的System.out.println(...)語句中,但是也會使Swing事件線程休眠,並將您的申請入睡。 所以你真的不想這樣做。

實際上,查看其是否在Swing中有效的最佳測試是您當前的代碼。 那會發生什么呢? 您聲明:

當我按下按鈕時,它會等待一段時間,從第一張開始到最后一張圖像,然后逐個跳過文件夾中的圖像

因此,實際上,您知道延遲對Swing無效,因為您描述了在Swing事件線程上腳的經典代碼症狀,使之屈膝。 因此,再次使用Swing計時器。 這是Swing Timer教程鏈接

如果這是我的代碼,我不會在每次按下按鈕時讀取圖像,而是一次讀取所有圖像,並且一次讀取一次,然后將它們放入稱為iconList的ArrayList<ImageIcon> 假設您這樣做了,那么代碼可能如下所示:

private void buttonShowImageActionPerformed(java.awt.event.ActionEvent evt) {
  // !! I'd use a variable or constant instead of the magic number 2000
  new Timer(2000, new ActionListener() {
    int count = 0;
    actionPerformed(ActionEvent e) {
      if (count != iconList.size()) {
        labelImage.setIcon(iconList.get(count));
        count++;
      } else {
        // stop the Timer
        ((Timer) e.getSource()).stop();
      }
    }
  }).start();
}

編輯
你問:

我的朋友最后一個問題.....我輸入“ int count = 0;”。 在actionPerformed內部,什么也沒發生……我不明白為什么只有在方法之外才能起作用。

請了解,Swing Timer的工作方式是在這里每2000秒重復調用actionPerformed方法。 我的代碼所做的是,當計時器啟動時,計數設置為0。每次調用actionPerformed方法時,計數將增加1,並顯示下一個ImageIcon。

使用您的代碼,當調用actionPerformed方法時,計數被重置為0,顯示第一個圖像,然后計數增加。 但是,每次調用actionPerformed方法時,您的代碼都會將計數重置為0 ,因此增量無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM