Java JTable中的动画
我试图把gif图像(动画)放到一个JTable单元格中,但它没有显示出来。正如我所读到的,JTable组件是静态的,需要重写呈现 关键是我有一个线程,它计算一些数据并将其粘贴到表格单元格中,而计算时我想显示一些旋转的轮子。此外,我从另一个单独的线程向表中添加行。因此,一个线程添加一行数据,另一个线程计算行中某个单元格的数据 是否可以将动画图标添加到每个添加行的同一单元格中?有人知道怎么做吗 Upd: 现在,我可以用动画gif创建一行,但不能从线程中将这样的行添加到表中Java JTable中的动画,java,multithreading,swing,animation,jtable,Java,Multithreading,Swing,Animation,Jtable,我试图把gif图像(动画)放到一个JTable单元格中,但它没有显示出来。正如我所读到的,JTable组件是静态的,需要重写呈现 关键是我有一个线程,它计算一些数据并将其粘贴到表格单元格中,而计算时我想显示一些旋转的轮子。此外,我从另一个单独的线程向表中添加行。因此,一个线程添加一行数据,另一个线程计算行中某个单元格的数据 是否可以将动画图标添加到每个添加行的同一单元格中?有人知道怎么做吗 Upd: 现在,我可以用动画gif创建一行,但不能从线程中将这样的行添加到表中 public class
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);
}
}
public类AnimatedIconTableExample扩展了JFrame{
私有静态最终长serialVersionUID=-1038271613549995183L;
公共AnimatedContableExample(){
超级(“动画可理解示例”);
最终对象[][]数据=新对象[][]{
{“”,新的图像图标(“src/loading.gif”),
“文本”};
最终对象[]列=新对象[]{“第一”、“第二”、“第三”、“第四”};
DefaultTableModel=新的DefaultTableModel(){
私有静态最终长serialVersionUID=31150076182704312L;
public int getColumnCount(){
返回列长度;
}
public int getRowCount(){
返回数据长度;
}
公共字符串getColumnName(int-col){
返回(字符串)列[col];
}
公共对象getValueAt(整数行,整数列){
返回数据[行][col];
}
公共类getColumnClass(int-col){
返回ImageIcon.class;
}
};
JTable table=新的JTable(模型);
setImageObserver(表);
JScrollPane=新的JScrollPane(表);
getContentPane()。添加(窗格);
对于(int i=0;i<5;i++){
新的TableUpdater(模型,数据).start();
}
}
私有void setImageObserver(JTable表){
TableModel模型=table.getModel();
int colCount=model.getColumnCount();
int rowCount=model.getRowCount();
for(int col=0;col
是否可以将动画图标添加到每个添加行的同一单元格中?
- ,
- 但是对于
来说,将更好、更舒适、更易于使用动画Gif
数组,由JLabels
GridLayout
是否可以将动画图标添加到每个添加行的同一单元格中?
- ,
- 但是对于
来说,将更好、更舒适、更易于使用动画Gif
数组,由JLabels
GridLayout
JTable
允许您放置图像和图标
您需要重写getColumnClass
方法。阅读
JTable
允许您放置图像和图标
您需要重写您的getColumnClass
方法。上面从MadProgrammer指向“此示例”的链接已断开。然而,我在这里找到了它,它有助于:
/*(swing1.1.1beta2)*/
//包jp.gr.java_conf.tame.swing.examples;
导入java.awt.*;
导入java.awt.event.*;
导入java.awt.image.*;
导入javax.swing.*;
导入javax.swing.table.*;
/**
*@version 1.0 06/19/99
*/
公共类AnimatedContableExample扩展了JFrame{
公共AnimatedContableExample(){
超级(“动画可理解示例”);
最终对象[][]数据=新对象[][]{
{新图像图标(“images/3-40.gif”)、新图像图标(“images/3-119.gif”)},
{新图像图标(“images/3-41.gif”)、新图像图标(“images/3-6.gif”)};
最终对象[]列=新对象[]{“男孩和女孩”、“狗和猫”};
AbstractTableModel模型=新Abs
/* (swing1.1.1beta2) */
//package jp.gr.java_conf.tame.swing.examples;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.table.*;
/**
* @version 1.0 06/19/99
*/
public class AnimatedIconTableExample extends JFrame {
public AnimatedIconTableExample(){
super( "AnimatedIconTable Example" );
final Object[][] data = new Object[][]{
{new ImageIcon("images/3-40.gif"),new ImageIcon("images/3-119.gif")},
{new ImageIcon("images/3-41.gif"),new ImageIcon("images/3-6.gif")}};
final Object[] column = new Object[]{"Boy and Girl","Dog and Cat"};
AbstractTableModel model = new AbstractTableModel() {
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 );
table.setRowHeight(50);
setImageObserver(table);
JScrollPane pane = new JScrollPane(table);
getContentPane().add(pane);
}
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++) {
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);
}
}