代码之家  ›  专栏  ›  技术社区  ›  Allen

在JTable单元中显示时间计数器的一种有效方法

  •  0
  • Allen  · 技术社区  · 15 年前

    时间计数器以秒为单位显示表中一行的时间。理想情况下,它将每秒更新一次。我知道我可以在表模型中增加适当的数据,触发事件(每行一个),等等。这看起来太过分了!有更好、更轻的方法吗?

    1 回复  |  直到 12 年前
        1
  •  2
  •   Peter Walser    15 年前

    您需要的是:

    下面是表格模型的一些伪代码:

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

    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的粒度只包含需要更新的单元格(在您的情况下:仅包含行龄的列),它就是实现这一点的最有效方法。