2015-04-24 33 views
4

Here is the processing.gif這裏是processing.gif爲什麼JTable列中不顯示動畫的.gif圖標?

Here is initial.png這裏被initial.png

Here is the output這裏是輸出

下面是代碼。 processing.gif正在其他位置工作,如在JTabbedPane的選項卡中。這裏在JTable的列中沒有顯示。任何解釋和解決方案? processing.gif是一個移動的圖標,表示正在加載內容。

import javax.swing.*; 
import javax.swing.table.*; 

public class TableIcon extends JFrame 
{ 
    public TableIcon() 
    { 
     ImageIcon initial = new ImageIcon(getClass().getResource("initial.png")); 
     ImageIcon processing = new ImageIcon(getClass().getResource("processing.gif")); 


     String[] columnNames = {"Picture", "Description"}; 
     Object[][] data = 
     { 
      {initial, "initial"}, 
      {processing, "processing"} 
     }; 

     DefaultTableModel model = new DefaultTableModel(data, columnNames); 
     JTable table = new JTable(model) 
     { 
      public Class getColumnClass(int column) 
      { 
       return getValueAt(0, column).getClass(); 
      } 
     }; 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 

     JScrollPane scrollPane = new JScrollPane(table); 
     getContentPane().add(scrollPane); 
    } 

    public static void main(String[] args) 
    { 
     TableIcon frame = new TableIcon(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

} 
+0

,正如我所說的它是在JTabbedPane的 –

+0

intial.png工作正在顯示,它與processing.gif位於同一位置。這裏不是問題。我很困惑爲什麼一個移動的.gif不能顯示在這裏的JTable –

+0

附加的圖像上面 –

回答

4

默認情況下,JTable中的動畫gif無法正常工作。但要解決這個問題的簡單方法,使用AnimatedIcon類,可以發現here

基本上,它重新實現Icon接口,註冊在那裏你呈現的圖標,當需要塗GIF的新框架,它會自動重新繪製正確的區域。

還有另一種替代方法here其中您爲每個需要呈現動畫gif的單元格註冊特定的ImageObserver,但我覺得它有點乏味。

+0

工作就像魔術!謝啦! –

0

如果在JTable中完全支持動畫GIF,那將是一件好事,但不幸的是它看起來不像。你已經提到它在JTabbedPane的標籤中工作。添加以下行至TableIcon構造函數的末尾:

getContentPane().add(new JLabel(processing), BorderLayout.SOUTH); 

這稍微改變了這種狀況:該表顯示GIF而不是空無一幀。動畫GIF正在標籤中工作。我還注意到,當您調整窗口大小時,表格中的動畫正在運行。這給了我這個骯髒的黑客,這似乎是我的系統上工作的想法(也加入到TableIcon構造函數的結尾):

final Timer animationTimer = new Timer(100, e -> table.repaint()); 
animationTimer.start(); 
當然