2014-05-15 45 views
0

以下是我正在嘗試做的事情 - 長話短說: 構建一個窗口(將稱爲MainWindow),頂部有按鈕,中心有一個圖片。我想給用戶選擇選擇做什麼(按鈕),而每隔幾秒鐘更改中心圖片。給用戶的部分選項是「暫停」和「恢復」 - 控制序列。 基本上嘗試通過線程更新GUI(MainWindow)。此線程將運行,而布爾'playSequence'將爲真。通過java中的線程顯示一系列圖像

有人能解釋我爲什麼不能得到它的工作..

這裏是代碼:

package SpecializedControls; 

import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.List; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingWorker; 
import DataEntities.SgiImage; 

public class SgiImagePanel extends JPanel implements Runnable { 
private List<SgiImage> seqImageList; 
private JLabel lastImage; 
private boolean playSequence; 

public SgiImagePanel(){} 

public SgiImagePanel (List<SgiImage> sequenceList) 
{ 
seqImageList = sequenceList ; 
} 


@Override 
public void run() { 
    // TODO Auto-generated method stub 

    while(playSequence) 
    { 
     for (SgiImage image : seqImageList) 
     { 
      display(image); 
      try { 
       Thread.sleep(3000); 
       } 
      catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       } 
     } 
    }  
} 

public void display(SgiImage image) 
{ 
    reset(); 
    JLabel picLabel = new JLabel(new ImageIcon(image.getImage())); 
    add(picLabel); 
    lastImage = picLabel; 
} 

public void display(List<SgiImage> sequenceList) 
{ 
    if(sequenceList==null) 
     return; 

    playSequence = true; 
    SgiImagePanel seq = new SgiImagePanel(sequenceList);   
    Thread thread = new Thread(seq); 
    thread.start(); 

} 

public void reset(){ 
    if (lastImage != null) 
    { 
     remove(lastImage); 
     lastImage = null; 
    } 
} 

public void pause() { 
    playSequence = false; 
} 

public void resume(){ 
    playSequence = true; 
} 


} 
+0

已經有一個線程畫在GUI內容。它被稱爲gui線程。其他人可以顯示的唯一方式是向其發送消息。其他線程不應該觸摸GUI對象。你知道同步,爲什麼使用它? – Val

回答

2
  1. 不要直接使用線程這一點。沒有必要,如果您在後臺線程中調用代碼而無需謹慎更改Swing狀態,則會帶來風險。
  2. 爲您的動畫循環使用擺動計時器。
  3. 在JLabel中將圖像顯示爲ImageIcons。
  4. 你的代碼的主要問題之一是你不斷創建一堆新的JLabel不必要和危險。一個JLabel就是你需要的一切,你想要的。相反,只需創建一次顯示JLabel的圖像,然後通過其setIcon(...)方法交換圖標。
  5. 只讀一次Icon,並將其保存在變量或集合中。
  6. 只需簡單地調用stop()方法即可輕鬆暫停擺動計時器,並可通過調用start()輕鬆地重新啓動擺動計時器。
0

嘗試使用此代碼加載圖像:

import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.JPanel; 

public class ImagePanel extends JPanel{ 

    private BufferedImage image; 

    public ImagePanel() { 
     try {     
      image = ImageIO.read(new File("image name and path")); 
     } catch (IOException ex) { 
      // handle exception... 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters    
    } 

}