0
時間計數器顯示錶格中某行的時間(以秒爲單位)。理想情況下,它會每秒更新一次。我知道我可以在表模型中增加適當的數據,觸發事件(每行一個)等等。看起來好像過度殺傷了!有更好,更輕的方法嗎?在JTable單元格中顯示時間計數器的有效方法
時間計數器顯示錶格中某行的時間(以秒爲單位)。理想情況下,它會每秒更新一次。我知道我可以在表模型中增加適當的數據,觸發事件(每行一個)等等。看起來好像過度殺傷了!有更好,更輕的方法嗎?在JTable單元格中顯示時間計數器的有效方法
你需要的是:
這裏有一個表模型的一些僞代碼:
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的粒度僅涵蓋了需要更新的單元格(在您的情況:只有與該行年齡列),這是實現這一最有效的方式。