[英]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.