문제

시간 카운터는 테이블에서 줄의 몇 초로 나이를 보여줍니다. 이상적으로는 초당 한 번 업데이트됩니다. 나는 테이블 모델에서 적절한 데이터를 증가시킬 수 있고, 이벤트 (행당 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의 세분성이 업데이트되어야하는 셀에만 포함되는 한 (귀하의 경우 : 행 연령이있는 열만)이를 실현하는 가장 효율적인 방법입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top