JTable 셀에서 시간 카운터를 표시하는 효율적인 방법
문제
시간 카운터는 테이블에서 줄의 몇 초로 나이를 보여줍니다. 이상적으로는 초당 한 번 업데이트됩니다. 나는 테이블 모델에서 적절한 데이터를 증가시킬 수 있고, 이벤트 (행당 1 행) 등을 발사 할 수 있다는 것을 알고 있습니다. 과잉처럼 보입니다! 더 나은 방법이 있습니까?
해결책
필요한 것은 다음과 같습니다.
- 테이블 모델에서 행의 '연령'을 모델링하는 방법. 이것은 암시 적으로 가장 잘 이루어 지므로 행의 생성 시간을 한 번 저장하고 셀 값이 요청 될 때 나이를 계산합니다 (Object getValueat (행, 열)).
- 매 초마다 테이블 변경 이벤트를 발사하는 (데몬) 스레드. 행 당 하나의 이벤트를 해고 할 필요는 없지만 전체 열 업데이트를 신호하는 이벤트를 발사 할 수 있습니다.
테이블 모델의 일부 의사 코드는 다음과 같습니다.
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
}
그런 다음 테이블 모델은 또한 스레드에 대한 메소드를 제공하므로 'Row Age'열에 대한 변경 이벤트를 발사 할 수 있습니다.
공개 클래스 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 (..) 메소드를 트리거합니다. 이 방법의 호출은 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의 세분성이 업데이트되어야하는 셀에만 포함되는 한 (귀하의 경우 : 행 연령이있는 열만)이를 실현하는 가장 효율적인 방법입니다.
제휴하지 않습니다 StackOverflow