2010-08-29 208 views
0

我想創建一個面板更改圖片。 這是我的面板:幀刷新問題

public class AdvertisementPanel extends JPanel { 
private BufferedImage image; 

private ArrayList<String> pictures; 
private int index = 0; 

public AdvertisementPanel(String... pics) { 
pictures = new ArrayList<String>(Arrays.asList(pics)); 
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(
new Runnable() { 
    @Override 
    public void run() { 
    changeImage(); 
    } 
}, 0, 5, TimeUnit.SECONDS); 

} 

public void paint(Graphics g) { 
g.drawImage(image, 0, 0, null); 
} 

private void changeImage() { 
String name = pictures.get(index); 
try { 
File input = new File(name); 
image = ImageIO.read(input); 
index++; 
index %= pictures.size(); 
} catch (IOException ie) { 
Logger.getLogger().log(Level.SEVERE, 
    "No adds found in given path: " + name); 
} 
} 

我有保持面板的框架,但沒有圖片顯示。 試圖定期從框架重新繪製 - 造成了一些有趣的,但不想要的結果... 任何想法爲什麼?我究竟做錯了什麼?我應該如何刷新框架的組件?

+1

'repaint'可能是答案。但我只想提到你應該重寫'paintComponent'而不是'paint'。你也可以擴展'JComponent'而不是'JPanel'(一些botchers擴展了'JPanel',因爲它會爲你調用'setOpaque(true);'(考慮到這個努力!),只有'JPanel'沒有如果你喜歡冒險的話,可以使用源代碼或者API文檔),但是一些PL&F可以,而'image'應該是'volatile',或者很好地傳遞給EDT。 – 2010-08-29 20:51:02

回答

1

每次更改圖像時都需要重新繪製。

哦,它應該由Swing事件處理線程來完成:

Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(
new Runnable() { 
    @Override 
    public void run() { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     changeImage(); 
     repaint(); 
     } 
    }; 
    } 
}, 0, 5, TimeUnit.SECONDS); 

更新來其他的一些問題

public class AdvertisementPanel extends JPanel { 
    private BufferedImage image; 
    private ArrayList<String> pictures; 
    private int index = 0; 

    public AdvertisementPanel(String... pics) { 
     pictures = new ArrayList<String>(Arrays.asList(pics)); 
     Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(
      new Runnable() { 
       @Override 
       public void run() { 
        changeImage(); 
       } 
      }, 0, 5, TimeUnit.SECONDS); 
    } 

    private void changeImage() { 
     final BufferedImage img = nextImage(); 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       image = img; 
       repaint(); 
      } 
     }); 
    } 

    public void paint(Graphics g) { 
     if (image != null) { 
      g.drawImage(image, 0, 0, null); 
     } 
    } 

    private BufferedImage nextImage() { 
     String name = pictures.get(index); 
     try { 
      index++; 
      index %= pictures.size(); 
      File input = new File(name); 
      return ImageIO.read(input); 
     } catch (IOException ie) { 
      Logger.getLogger("").log(Level.SEVERE, 
        "No adds found in given path: " + name); 
      return null; 
     } 
    } 
} 
+0

如何?我沒有圖形對象。你可能不想在EDT上做文件I/O – Udi 2010-08-29 20:31:40

+1

5秒鐘後(第二次迭代..)幀被重新粉刷所有創造一個混亂...爲什麼? – 2010-08-29 20:47:47

+0

感謝評論人員Maurice - 我使用了你的代碼,並且它開始很棒,但是它可能會在一段時間內改變一次? – Udi 2010-08-29 21:01:56