Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable中的动画_Java_Multithreading_Swing_Animation_Jtable - Fatal编程技术网

Java JTable中的动画

Java JTable中的动画,java,multithreading,swing,animation,jtable,Java,Multithreading,Swing,Animation,Jtable,我试图把gif图像(动画)放到一个JTable单元格中,但它没有显示出来。正如我所读到的,JTable组件是静态的,需要重写呈现 关键是我有一个线程,它计算一些数据并将其粘贴到表格单元格中,而计算时我想显示一些旋转的轮子。此外,我从另一个单独的线程向表中添加行。因此,一个线程添加一行数据,另一个线程计算行中某个单元格的数据 是否可以将动画图标添加到每个添加行的同一单元格中?有人知道怎么做吗 Upd: 现在,我可以用动画gif创建一行,但不能从线程中将这样的行添加到表中 public class

我试图把gif图像(动画)放到一个JTable单元格中,但它没有显示出来。正如我所读到的,JTable组件是静态的,需要重写呈现

关键是我有一个线程,它计算一些数据并将其粘贴到表格单元格中,而计算时我想显示一些旋转的轮子。此外,我从另一个单独的线程向表中添加行。因此,一个线程添加一行数据,另一个线程计算行中某个单元格的数据

是否可以将动画图标添加到每个添加行的同一单元格中?有人知道怎么做吗

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);
    }
}
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);
  }
}