gif 画像 (アニメーション) を JTable セルに入れようとしていますが、表示されません。私が読んだように、JTable コンポーネントは静的であり、レンダリングを書き直す必要があります。
ポイントは、いくつかのデータを計算してテーブルセルに貼り付けるスレッドがあり、計算中に回転ホイールを表示したいということです。さらに、別の別のスレッドからテーブルに行を追加します。したがって、1 つのスレッドがデータを含む行を追加し、別のスレッドがその行のセルのデータを計算します。
追加された各行の同じセルにアニメーション アイコンを追加することは可能ですか? 誰もそれを行う方法を考えていますか?
Upd: アニメーション GIF で行を作成できるようになりましたが、そのような行をスレッドからテーブルに追加することはできません
public class AnimatedIconTableExample extends JFrame {
private static final long serialVersionUID = -1038271613549995183L;
public AnimatedIconTableExample() {
super("AnimatedIconTable Example");
final Object[][] data = new Object[][] {
{ "", "", new ImageIcon("src/loading.gif"),
"text" } };
final Object[] column = new Object[] { "First", "Second", "Third", "Fourth" };
DefaultTableModel model = new DefaultTableModel() {
private static final long serialVersionUID = 31150076182704312L;
public int getColumnCount() {
return column.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return (String) column[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
public Class<?> getColumnClass(int col) {
return ImageIcon.class;
}
};
JTable table = new JTable(model);
setImageObserver(table);
JScrollPane pane = new JScrollPane(table);
getContentPane().add(pane);
for (int i = 0; i < 5; i++) {
new TableUpdater(model, data).start();
}
}
private void setImageObserver(JTable table) {
TableModel model = table.getModel();
int colCount = model.getColumnCount();
int rowCount = model.getRowCount();
for (int col = 0; col < colCount; col++) {
if (ImageIcon.class == model.getColumnClass(col)) {
for (int row = 0; row < rowCount; row++) {
Object obj = model.getValueAt(row, col);
ImageIcon icon = null;
if (obj instanceof ImageIcon)
icon = (ImageIcon) model.getValueAt(row, col);
if (icon != null) {
icon.setImageObserver(new CellImageObserver(table, row,
col));
}
}
}
}
}
class CellImageObserver implements ImageObserver {
JTable table;
int row;
int col;
CellImageObserver(JTable table, int row, int col) {
this.table = table;
this.row = row;
this.col = col;
}
public boolean imageUpdate(Image img, int flags, int x, int y, int w,
int h) {
if ((flags & (FRAMEBITS | ALLBITS)) != 0) {
Rectangle rect = table.getCellRect(row, col, false);
table.repaint(rect);
}
return (flags & (ALLBITS | ABORT)) == 0;
}
}
public static void main(String[] args) {
AnimatedIconTableExample frame = new AnimatedIconTableExample();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.setSize(300, 150);
frame.setVisible(true);
}
}
public class TableUpdater extends Thread {
private DefaultTableModel model;
private Object[][] data;
public TableUpdater(DefaultTableModel model, Object[][] data) {
this.model = model;
this.data = data;
}
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
model.addRow(data);
}
}