2012-10-12 44 views
0

我試圖自動滾動到具有可變行高度並定期刷新的JTable(在scrollPane內)的底部。是否有一個我可以覆蓋的偵聽器,或者是一個我可以聽的事件,這個事件會在表格被底部的新行重新繪製後發生?Jtable-滾動到可變高度行的底部

我通過覆蓋列的渲染器來實現變量高度,如果列中的文本長度超過可以在列寬度的一行中顯示的行重置行高度。

private void adjustRowHeight() 
{ 
    if (_table == null) 
    { 
     return; 
    } 

    int cWidth = _table.getTableHeader().getColumnModel().getColumn(_column).getWidth(); 
    _textComponent.setSize(new Dimension(cWidth - 2*HORIZONTAL_GAP, MAX_HEIGHT)); 
    int prefH = _textComponent.getPreferredSize().height; 

    boolean isTooBig = prefH > MAX_HEIGHT; 

    if (isTooBig) 
    { 
     prefH = MAX_HEIGHT; 
    } 

    _table.setRowHeight(_row, prefH + 2); 
} 

我的scrollToBottom代碼,如下。

在我創建行變量高度之前,它引用行數而不是MAX_VALUE,但引用有效行索引時使用默認行高來計算行的位置,而不是行高變化。

_table.scrollRectToVisible(_table.getCellRect(Integer.MAX_VALUE, 0, true)); 

使用Integer.MAX_VALUE的覆蓋默認的計算中使用的表的高度爲矩形的y值。我認爲發生的事情是這個代碼在表被重新繪製(和高度重置)之前被調用,即使新行已被添加到表中。是否有一個事件我可以聽到,以瞭解何時桌面上的高度已重置,因此我可以使用scrollToBottom?還是有什麼我在這裏失蹤?

+1

_implemented變量高度通過重寫列的渲染器來重置行height_ - 取決於_when_渲染器這樣做,它可能是非常錯誤的:它*不能*在getTableCellRendererComponent中執行它 – kleopatra

回答

0

是否有聽衆我可以覆蓋,或者一個事件,我可以聽,表後會發生已經重繪與新行底端?

是否有一個事件我可以聽,知道什麼時候桌子上的高度已被重置,所以我可以然後scrollToBottom?

是的。在JTable的父類中找到,Component#addComponentListener(ComponentListener),我可以覆蓋componentResized方法。

+1

並不完全確定這是否是您真正想要的:每次大小更改都會觸發該事件。如果f.i.用戶在查看行的頂部時改變寬度,當滾動到底部時他/他可能非常惱火。 – kleopatra

+0

謝謝。好點子。用戶可以選擇「自動滾動」。我以爲會覆蓋它,但我應該檢查行數是否已更改,然後滾動到底部。 – rediVider

2

有兩種方式,

  • JScrollBar

  • JViewport搬家,

我太prefering這種方式,那麼就可以管理用此Point及其座標,for example

有沒有可以重寫的偵聽程序,或者我可以偵聽的事件,這種情況會在底部的新行重新繪製表格後發生?

是否有一個事件我可以聽,知道什麼時候桌子上的高度已被重置,所以我可以然後scrollToBottom?

private void addTableListener() { 
    model.addTableModelListener(new TableModelListener() { 

     @Override 
     public void tableChanged(TableModelEvent tme) { 
      if (table.getRowCount() > 0) { 
       if (tme.getType() == TableModelEvent.INSERT) { 

       } else if (tme.getType() == TableModelEvent.DELETE) { 

       } else if (tme.getType() == TableModelEvent.UPDATE) { 

       } 
      } 
     } 
    }); 
} 

一切都取決於OD ListSelectionModel

+0

這不回答問題。 scrollRectToVisible已經在發生,我既不需要也不想改變用戶的選擇。問題是scrollRectToVisible發生在計算正確的矩形y座標之前。 – rediVider

+0

???這個問題我不能從你的代碼???,不知道,我的鏈接代碼已獲得相同的問題獲取/設置行座標在飛行中,更好的可以發佈你的問題轉換爲[SSCCE](http: //sscce.org/m),以避免任何可能的缺陷來自您的其他代碼,對不起,您的代碼中包含的電池不包含在此處 – mKorbel

+0

Thx用於編輯。 tableChanged方法在我的渲染器調整行高之前也被調用,所以我遇到了同樣的問題。 – rediVider