2009-05-12 28 views
43

Tôi có một JTable nằm trong một dòng JScrollPane. Hàng được thêm vào bảng tại thời gian chạy dựa trên các sự kiện xảy ra trong ứng dụng của tôi. Tôi muốn cuộn bảng cuộn ở cuối bảng khi một hàng mới được thêm vào bảng.Cuộn JTable đến Chỉ mục Hàng Chỉ định

Đối với JLists Có [ensureIndexIsVisible][1]() buộc một chỉ mục cụ thể trong danh sách hiển thị. Tôi đang tìm kiếm điều tương tự nhưng đối với một JTable. Có vẻ như tôi có thể phải di chuyển chế độ xem cuộn theo cách thủ công trên ngăn cuộn nhưng tôi đã thấy rằng phải có cách dễ dàng hơn.

Trả lời

33

Xem ví dụ này: http://www.exampledepot.com/egs/javax.swing.table/Vis.html

update: liên kết hiện nay đã lỗi thời, đây là mã (từ http://smi-protege.stanford.edu/repos/protege/protege-core/trunk/src/edu/stanford/smi/protege/util/ComponentUtilities.java)

public static void scrollToVisible(JTable table, int rowIndex, int vColIndex) { 
     if (!(table.getParent() instanceof JViewport)) { 
      return; 
     } 
     JViewport viewport = (JViewport)table.getParent(); 

     // This rectangle is relative to the table where the 
     // northwest corner of cell (0,0) is always (0,0). 
     Rectangle rect = table.getCellRect(rowIndex, vColIndex, true); 

     // The location of the viewport relative to the table 
     Point pt = viewport.getViewPosition(); 

     // Translate the cell location so that it is relative 
     // to the view, assuming the northwest corner of the 
     // view is (0,0) 
     rect.setLocation(rect.x-pt.x, rect.y-pt.y); 

     table.scrollRectToVisible(rect); 

     // Scroll the area into view 
     //viewport.scrollRectToVisible(rect); 
    } 
+0

Sai và quá phức tạp! Điều này có thể được thực hiện trong một dòng đơn: – Elmue

+0

table.scrollRectToVisible (table.getCellRect (hàng, cột, true)); – Elmue

4

JList trong nội bộ sử dụng scrollRectToVisible và xác định tọa độ để di chuyển đến. Tôi nghĩ rằng bạn sẽ phải recode một chức năng tương tự cho JTable.

65

Rất dễ, JTable cũng có phương thức scrollRectToVisible. Nếu bạn muốn, bạn có thể thử một cái gì đó như thế này để làm ScrollPane đi đến phía dưới nếu một bản ghi mới được thêm vào:

jTable1.getSelectionModel().setSelectionInterval(i, i); 
jTable1.scrollRectToVisible(new Rectangle(jTable1.getCellRect(i, 0, true))); 

đâu i là mẩu tin được thêm ngoái.

+1

Điều này hoạt động tốt, như mong đợi, và các chức năng như Ensureindexisvisible() (hoặc bất kỳ phương thức đó là) từ Jlist. Mã được đánh dấu là câu trả lời không hoạt động đúng. nó đã không di chuyển tất cả các cách để chỉ số sau khi một cuộc gọi 5-6 xuống một danh sách dài hơn và sẽ không hiển thị toàn bộ hàng mỗi khi nó đã di chuyển. một số hàng bị cắt bỏ. Đây sẽ là câu trả lời. – Bastiat

+1

Đơn giản và hoạt động. Chỉ một câu hỏi, mục đích của dòng đầu tiên là gì? Có vẻ như dòng thứ hai là đủ. Btw, tôi cũng cần phải cuộn đến một cột cụ thể và nó cũng hoạt động tốt bằng cách thiết lập tham số thứ hai của getCellRect. – Smig

+0

... và ý nghĩa của hình chữ nhật mới() là gì? getCellRect() đã trả về một hình chữ nhật! – Elmue

1

Câu trả lời đầu tiên hoạt động tốt, nhưng hàng đã chọn được đặt ở cuối bảng. Vì vậy, tôi đã tạo phiên bản được sửa đổi này:

private void scrollToVisible(int rowIndex, int vColIndex) { 
     JTable table = getTablePanel().getTable(); 
     if (!(table.getParent() instanceof JViewport)) { 
      return; 
     } 
     if (table.getRowCount()<1){ 
      return; 
     } 
     JViewport viewport = (JViewport)table.getParent(); 
     // view dimension 
     Dimension dim = viewport.getExtentSize(); 
     // cell dimension 
     Dimension dimOne = new Dimension(0,0); 

     // This rectangle is relative to the table where the 
     // northwest corner of cell (0,0) is always (0,0). 
     Rectangle rect = table.getCellRect(rowIndex, vColIndex, true); 
     Rectangle rectOne; 
     if (rowIndex+1<table.getRowCount()) { 
      if (vColIndex+1<table.getColumnCount()) 
       vColIndex++; 
      rectOne = table.getCellRect(rowIndex+1, vColIndex, true); 
      dimOne.width=rectOne.x-rect.x; 
      dimOne.height=rectOne.y-rect.y; 
     } 

     // '+ veiw dimension - cell dimension' to set first selected row on the top 

     rect.setLocation(rect.x+dim.width-dimOne.width, rect.y+dim.height-dimOne.height); 

     table.scrollRectToVisible(rect); 
    } 

Bây giờ hàng được chọn sẽ được đặt ở đầu bảng.

+0

không, bạn không cần chế độ xem để cuộn đến bất kỳ đâu trong bảng (tất cả các thành phần có phương thức getVisibleRect) – kleopatra

0

Dường như với tôi dễ dàng hơn nhiều để đặt vị trí chế độ xem thay vì cuộn bảng. Sau đây là mã của tôi.

public void scrollCellToView(int rowIndex, int vColIndex) { 
    if (!(this.getParent() instanceof JViewport)) { 
     return; 
    } 
    JViewport viewport = (JViewport) this.getParent(); 
    Rectangle rect = this.getCellRect(rowIndex, vColIndex, true); 
    Rectangle viewRect = viewport.getViewRect(); 

    int x = viewRect.x; 
    int y = viewRect.y; 

    if (rect.x >= viewRect.x && rect.x <= (viewRect.x + viewRect.width - rect.width)){ 

    } else if (rect.x < viewRect.x){ 
     x = rect.x; 
    } else if (rect.x > (viewRect.x + viewRect.width - rect.width)) { 
     x = rect.x - viewRect.width + rect.width; 
    } 

    if (rect.y >= viewRect.y && rect.y <= (viewRect.y + viewRect.height - rect.height)){ 

    } else if (rect.y < viewRect.y){ 
     y = rect.y; 
    } else if (rect.y > (viewRect.y + viewRect.height - rect.height)){ 
     y = rect.y - viewRect.height + rect.height; 
    } 

    viewport.setViewPosition(new Point(x,y)); 
} 
+0

Dường như hoạt động tốt! được điều chỉnh tại đây: http://tinybrain.de/1004329 –

Các vấn đề liên quan