2009-03-04 25 views
0

時間計數器顯示錶格中某行的時間(以秒爲單位)。理想情況下,它會每秒更新一次。我知道我可以在表模型中增加適當的數據,觸發事件(每行一個)等等。看起來好像過度殺傷了!有更好,更輕的方法嗎?在JTable單元格中顯示時間計數器的有效方法

回答

2

你需要的是:

  • 到該行的「年齡」模型在表格模型的方式。這最好是隱式完成的,因此您只需將該行的創建時間存儲一次,並計算請求單元格值的時間(Object getValueAt(row,column))。
  • 一個(守護進程)每秒觸發表變化事件的線程。您不必每行觸發一個事件,但是您可以觸發一個事件來指示整列更新。

這裏有一個表模型的一些僞代碼:

public Object getValueAt (int rowIndex, int columnIndex) { 

    // if it's the column with the 'row age', calculate the age and return it 
    long rowAgeMs = System.currentTimeMs() - getCreationTime(rowIndex); 

    // return the age in milliseconds, or a date, or a formatted time string 
} 

表模型應該然後還提供了一個方法的線程,因此它可以爲「行時代」列火更改事件:

公共類MyTableModel實現TableModel的{

private final List<TableModelListener> listeners = new LinkedList<TableModelListener>(); 

    public void addTableModelListener (TableModelListener l) { 
      listeners.add(l); 
    } 

    public void removeTableModelListener (TableModelListener l) { 
      listeners.remove(l); 
    } 

    public void updateColumn (int column) { 
      TableModelEvent evt = new TableModelEvent(this, 0, Math.max(0, getRowCount() - 1), column); 
      for (TableModelListener listener : listeners) { 
       listener.tableChanged(evt); 
      } 
    } 

線程會然後就觸發updateColumn(..)方法EA 「行時代」專欄排名第二。此方法的調用應該在EventDispatchThread中完成,使用SwingUtilities.invokeAndWait(..)或SwingUtilities.invokeLater(..)完成。

Thread rowAgeUpdater = new Thread() { 

     @Override 
     public void run() { 
      while (isAlive()) { 
       try { 

        long time = System.currentTimeMillis(); 
        long sleepTime = (time/1000 + 1) * 1000 - time; 
        Thread.sleep(sleepTime); 

        SwingUtilities.invokeAndWait(new Runnable() { 
         public void run() { 
          model.updateColumn(ROW_AGE_COLUMN_INDEX); 
         } 
        }); 

       } catch (Exception e) { 
        return; 
       } 

      } 
     } 
    }; 
    rowAgeUpdater.setDaemon(true); 
    rowAgeUpdater.setPriority(Thread.MIN_PRIORITY); 
    rowAgeUpdater.start(); 

只要TableModelEvent的粒度僅涵蓋了需要更新的單元格(在您的情況:只有與該行年齡列),這是實現這一最有效的方式。

相關問題