2015-01-30 4 views
0

Ниже я предоставляю свой реплицируемый код. Проблема в том, что он заполняет все ячейки серым цветом. Тем не менее, мне просто нужно сделать ячейку серого цвета «движущейся» от столбца 0 до последнего столбца (для строки 0).Как изменить цвет ячеек в JTable, чтобы обеспечить эффект анимации?

Кроме того, как создать более одной ячейки «перемещение» в очереди?

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

} 
+0

[см., почему избежать вызова table.repaint();] (http://stackoverflow.com/questions/16814512/tablecellrenderer-and-how-to-refresh-cell-background-without-use-jtable-repain), чтобы сохранить Цвета в модели (некоторый массив) и [изменить цвет в TableCellRenderer] (http: // www. oracle.com/technetwork/java/christmastree-138396.html) – mKorbel

+0

пожалуйста, что «чем одна ячейка» перемещается «в очереди?», чтобы передать «ячейку» в JLabel, так как в стороне я предлагаю скрытый индекс от представления до модель – mKorbel

+0

@mKorbel: спасибо. Я устанавливаю TableCellRenderer PaintCell, который расширяет DefaultTableCellRenderer. Как я могу динамически изменять цвета в PaintCell без table.repaint()? –

ответ

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 и сравните ряда клеток/столбец рендеринга ячейки

+0

Большое спасибо. Вы знаете, как применить эту анимацию только к строке 0? –

+0

Я знаю, что это можно сделать, если (index> table.getColumnCount()), но проблема в том, что процесс повторяется, хотя я прокомментировал строку timer.setRepeats (true); –

+0

Итак, как только вы прошли через все столбцы, остановите таймер, '((Timer) e.getSource()). Stop();' или некоторые такие ... – MadProgrammer