2009-03-04 13 views

cevap

2

İhtiyacın olan:

  • tablo modelinde sıranın 'age' modellemek için bir yol. Bu en mantıklı bir şekilde yapılır, böylece satırın oluşturulma süresini bir kez depolar ve hücre değeri istendiğinde yaşı hesaplarsınız (Object getValueAt (satır, sütun)).
  • Her saniye tablo değişikliği olayını tetikleyen A (daemon) iş parçacığı. Her satırda bir olay tetiklemek zorunda değilsiniz, bunun yerine tüm sütun güncellemesini gösteren bir olayı tetikleyebilirsiniz. o satır yaşı 'sütun için bir değişiklik olayı böylece masa model daha sonra da, iplik için bir yöntem sunmalıdır

    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 
    } 
    

    : Burada

masa modeli için bazı pseudocode var

public class MyTableModel TableModel uygular {

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

sonra sadece updateColumn tetikleyecek iplik (..) yöntemi ea 'row age' sütunu için ikinci saniye. Bu yöntemin başlatılması EventDispatchThread içinde yapılmalıdır, bu SwingUtilities.invokeAndWait (..) veya SwingUtilities.invokeLater (..) kullanılarak yapılır.

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(); 

sürece TableModelEvent ayrıntı düzeyi, sadece güncellenmesi gereken hücreleri kapsar olarak (sizin durumunuzda: satır yaşla birlikte yalnızca sütun), bu fark en etkili yoldur.