0

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

3 に答える 3

2

Is it possible to add an animation icon into the same cell in each added row?

  • Renderer を見て

  • しかし、 foranimated Gifはより良く、快適で、より使いやすく、 の配列をJLabels並べたGridLayout

于 2013-02-01T19:59:30.957 に答える
2

エディタとレンダラーについて読んでください。

JTable画像やアイコンを配置できます。

メソッドをオーバーライドする必要がありますgetColumnClass

于 2013-02-01T20:23:11.530 に答える
0

上記の MadProgrammer の「この例」へのリンクは壊れています。しかし、私はここでそれを見つけました、そしてそれは役に立ちました: AnimatedIconTableExample.java

/* (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);
  }
}
于 2019-03-07T12:12:18.683 に答える