2011-09-12 75 views
1

我有一個使用EventTableModel創建的JTable,它位於JScrollPane中。 EventTableModel從事件列表中獲取實時更新並將結果顯示在表中。隨着新的結果進入表格,新的信息顯示在表格的頂部。使用JTable和JScroll窗格滾動鎖

但是,我想要做的就是凍結表格,以顯示當我按下名爲「鎖定表」的按鈕時顯示的內容。這個按鈕應該和eclipse控制檯'Scroll Lock'有相同的效果,因此當新項目出現時,當前項目應該保留在屏幕上,並且不會在新項目出現時被推出。但是新項目仍然應該被添加,而不是自動滾動到。

有誰知道我可以嘗試實現此功能。因此,隨着更新的進行,桌面上的數據不會被強制關閉,因此當按下複選框時,焦點將保留在當前數據上。

感謝您的任何幫助。 邁克爾

回答

2

基本程序(對於上面的當前顯示區域中插入)

  • 上表的上啓用鎖定模型
  • 安裝TableModelListener:請注意當前的可視矩形下面的行數
  • 在鎖定時接收插入,滾動以使下面的行數保持不變

一些工作代碼(使用JXTabl E,因爲它具有方便的方法進行滾動,對於核心表只是自己做的計算:-)

public static class ScrollLock { 
    private JXTable table; 
    private boolean blocked; 
    private int rowsBelow; 

    public ScrollLock(JXTable table) { 
     this.table = table; 
     table.getModel().addTableModelListener(getTableModelListener()); 
    } 

    private TableModelListener getTableModelListener() { 
     TableModelListener l = new TableModelListener() { 

      @Override 
      public void tableChanged(TableModelEvent e) { 
       if (!blocked) return; 
       if (e.getType() == TableModelEvent.INSERT) { 
        updateInsert(e.getFirstRow(), e.getLastRow()); 
       } 
      } 

     }; 
     return l; 
    } 

    protected void updateInsert(int firstRow, int lastRow) { 
     // PENDING: assumption is that insert always above 
     // need additional logic for other cases 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       Rectangle r = table.getVisibleRect(); 
       int row =table.rowAtPoint(new Point(0, r.y + r.height)); 
       int lastVisible = table.getRowCount() - rowsBelow; 
       table.scrollRowToVisible(lastVisible); 
      } 
     }); 
    } 

    public void block() { 
     Rectangle viewRect = table.getVisibleRect(); 
     int lastVisibleRow = table.rowAtPoint(new Point(0, viewRect.y + viewRect.height)); 
     rowsBelow = table.getRowCount() - lastVisibleRow; 
     blocked = true; 
    } 

    public void unblock() { 
     blocked = false; 
     rowsBelow = -1; 
    } 

} 
+0

的問題,這種做法是表跳,行不留反正有fixed.Is到只需確保上面添加的行以及當前表格字段保留在屏幕上,而其他表格行則添加在上面。 – Michaelb88