2012-05-24 3 views
3

Я пишу приложение, используя библиотеку Swing на Java. У меня есть компонент таблицы, который расширяет JTable, и в этом компоненте я переопределил метод getTableCellRendererComponent, потому что я окрашиваю ячейки таблицы. У меня есть пользовательская модель таблицы (которая простирается от модели таблицы по умолчанию), а сам компонент таблицы я добавил в JPanel. Все это работает.JTable с миганием ячейки

Теперь я хотел бы добавить к этой таблице некоторую функциональность, чтобы мигать ячейка. Потенциально одновременно может мигать несколько чейков, т. Е. Ячейки в (строка 1, столбец 2) и (строка 3, столбец 4).

Это можно сделать? Любые подсказки, которые могли бы начать меня, были бы оценены.

+2

да возможно, ничего особенного, изменить вопрос с [SSCCE] (http://sscce.org/) демонстрирует свой вопрос (ы), но после прочтения [JTable учебник] (HTTP: // docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender) – mKorbel

+0

Я бы использовал прослушиватель. Я думаю, ActionListener будет делать трюк –

+2

Как actionListener заставит его мигать, вам нужно будет использовать что-то вроде таймера, чтобы это сделать – mprabhat

ответ

3

Я нахожу одну статью для вашего ответа:

http://www.devx.com/DevX/10MinuteSolution/17167/0/page/1

страница предоставить исходный код для загрузки.

В основном он использует следующий метод для уведомления таблицы для своевременного обновления ячейки.

JTable.tableChanged(new TableModelEvent(table.getModel(), firstRow, lastRow, column)); 

После прочтения его кода, я перебирать более простую версию своего кода, вы можете изменить свой код или использовать свой код (более изящным, но и более сложный).

public class FlashCellTable 
{ 
    public static Color color; 

    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setSize(800, 600); 

     final JTable table = new JTable(4, 4); 
     table.setDefaultRenderer(Object.class, new MyFlashingCellRenderer()); 
     table.setValueAt("Flashing", 0, 0); 
     frame.getContentPane().add(new JScrollPane(table)); 

     final long startTime = System.currentTimeMillis(); 

     Thread thread = new Thread() 
     { 
      @Override 
      public void run() 
      { 
       while (true) 
       { 
        long now = System.currentTimeMillis(); 
        long second = (now - startTime)/1000; 
        color = second/2 * 2 == second ? Color.red : Color.blue; 

        System.out.println("FlashCellTable.run"); 

        SwingUtilities.invokeLater(new Runnable() 
        { 
         public void run() 
         { 
          table.tableChanged(new TableModelEvent(table.getModel(), 0, 0, 0)); 
         } 
        }); 
        try 
        { 
         Thread.sleep(1000); 
        } 
        catch(InterruptedException e) 
        { 
         e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
        } 
       } 
      } 
     }; 

     thread.start(); 

     frame.setVisible(true); 
    } 

    public static class MyFlashingCellRenderer extends DefaultTableCellRenderer 
    { 
     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 
                 int row, int column) 
     { 
      JLabel label = 
       (JLabel)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

      if ("Flashing".equals(value)) 
      { 
       label.setBackground(color); 
      } 
      else 
      { 
       label.setBackground(Color.white); 
      } 
      return label; 
     } 
    } 
} 
+0

этот пример - причина, по которой Swing Timer существует, btw +1 – mKorbel

+0

@mKorbel благодарит за голосование, и один маленький вопрос, мне нужно поставить table.tableChanged() в SwingUtilities.invokeLater()? спасибо – chenyi1976

+0

В принципе, Swing ничего не знает о Thread, тогда все выходные (от Thread) to non_Thread_Safe методы (setText, appent, например) вышли из EDT, ответ да, требуется, и его самый безопасный, Swing Timer - лучший способ для этого, вместо использования Thread и с Thread.Sleep (int) – mKorbel