Bir zaman sayacı, tablodaki bir satırın saniye cinsinden yaşını gösterir. İdeal olarak, saniyede bir kez güncellenir. Biliyorum ki, tablo modelindeki uygun verileri artırabilirim, olayları (her satırda bir), vb. Ateşleyebilirim. Overkill gibi görünüyor! Daha iyi, daha hafif bir yol var mı?JTable hücresinde bir zaman sayacını görüntülemek için etkili bir yol
0
A
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.