为什么动画 .gif 图标没有显示在 JTable 列中?
Why is an animated .gif icon not showing in JTable column?
这里是processing.gif
这里是initial.png
这是输出
这是代码。 processing.gif 正在其他位置工作,例如 JTabbedPane
的选项卡中。这里在a 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);
}
}
默认情况下,动画 gif 在 JTable 中效果不佳。但是有一个简单的方法可以解决这个问题,使用 AnimatedIcon
class 可以找到 here
基本上是重新实现Icon
接口,注册你渲染图标的地方,当需要绘制新的gif帧时,它会自动重新绘制正确的区域。
还有另一种选择here,您可以在其中为每个需要呈现动画 gif 的单元格注册一个特定的 ImageObserver,但我觉得它有点乏味。
如果 JTable
完全支持动画 GIF 就好了,但遗憾的是它看起来不像。您已经提到它在 JTabbedPane
的选项卡中确实有效。我在 TableIcon
构造函数的末尾添加了以下行:
getContentPane().add(new JLabel(processing), BorderLayout.SOUTH);
这稍微改变了情况:table 显示了 GIF 的一帧而不是什么都没有。动画 GIF 在标签中工作。我还注意到,当您调整 window 的大小时,table 中的动画是 运行。这给了我这个肮脏的黑客的想法,它似乎在我的系统上工作(也添加到 TableIcon
构造函数的末尾):
final Timer animationTimer = new Timer(100, e -> table.repaint());
animationTimer.start();
这是代码。 processing.gif 正在其他位置工作,例如 JTabbedPane
的选项卡中。这里在a 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);
}
}
默认情况下,动画 gif 在 JTable 中效果不佳。但是有一个简单的方法可以解决这个问题,使用 AnimatedIcon
class 可以找到 here
基本上是重新实现Icon
接口,注册你渲染图标的地方,当需要绘制新的gif帧时,它会自动重新绘制正确的区域。
还有另一种选择here,您可以在其中为每个需要呈现动画 gif 的单元格注册一个特定的 ImageObserver,但我觉得它有点乏味。
如果 JTable
完全支持动画 GIF 就好了,但遗憾的是它看起来不像。您已经提到它在 JTabbedPane
的选项卡中确实有效。我在 TableIcon
构造函数的末尾添加了以下行:
getContentPane().add(new JLabel(processing), BorderLayout.SOUTH);
这稍微改变了情况:table 显示了 GIF 的一帧而不是什么都没有。动画 GIF 在标签中工作。我还注意到,当您调整 window 的大小时,table 中的动画是 运行。这给了我这个肮脏的黑客的想法,它似乎在我的系统上工作(也添加到 TableIcon
构造函数的末尾):
final Timer animationTimer = new Timer(100, e -> table.repaint());
animationTimer.start();