如何在JTable中更改单元格的颜色以提供动画效果?

时间:2015-01-30 09:43:18

标签: java swing animation jtable

下面我提供我的可复制代码。问题是它用灰色填充所有细胞。但是,我只需要制作一个灰色的细胞"移动"从第0列到最后一列(第0行)。

此外,如何创建多个单元格"移动"在队列中?

import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.Timer;
import javax.swing.table.DefaultTableCellRenderer;

public class test2 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI(); 
            }
        });     
    }

    private static void createAndShowGUI() {
        gtest t= new gtest("TEST");
        f.pack();
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);
    }
}  

class gtest extends JFrame
{

    private static JTable table;
    private int index;

    public gtest(String title)
    {
        table = new JTable(6, 10);
        table.setDefaultRenderer(Object.class, new PaintCell());
        add(table);
        startAnimation();       
    }

    private void startAnimation() {
        Timer timer = new Timer(100, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                index++;
                if (index > table.getRowCount() * table.getColumnCount())
                    index = 0;
                table.repaint();
            }
        });
        //timer.setRepeats(true);
        timer.start();
    }
    class PaintCell extends DefaultTableCellRenderer {
        private static final long serialVersionUID = 1L;
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            Component cell = super.getTableCellRendererComponent(table, value,
                    isSelected, hasFocus, row, column);
            int id = row * table.getRowCount() + column;
            cell.setBackground(id < index ? Color.LIGHT_GRAY : null);
            return cell;
        }
    }

}

1 个答案:

答案 0 :(得分:1)

更改...

int id = row * table.getRowCount() + column;
cell.setBackground(id < index ? Color.LIGHT_GRAY : null);

要...

int checkRow = index / table.getColumnCount();
int checkCol = index % table.getColumnCount();

cell.setBackground(checkRow == row && checkCol == column ? Color.LIGHT_GRAY : null);

这将根据index的当前值以及与单元格渲染器的单元格行/列的比较来计算行和列

相关问题