2010-05-01 23 views
5

Tôi đang sử dụng Swing JTable và tôi muốn buộc phải cuộn đến một hàng cụ thể bên trong nó. Điều đó rất đơn giản bằng cách sử dụng scrollRowToVisible (...), nhưng tôi muốn trước tiên kiểm tra hàng này chưa hiển thị trên màn hình trước khi cuộn đến màn hình, như thể nó đã hiển thị không cần phải cuộn.Kiểm tra xem một hàng có xuất hiện trên màn hình trước khi buộc phải di chuyển đến nó không?

Tôi có thể làm điều đó bằng cách nào?

Trả lời

1

Liên kết bên dưới là một bài viết xác định xem ô có hiển thị hay không. Bạn có thể sử dụng nó - nếu ô hiển thị, thì hàng có thể nhìn thấy được. (Nhưng tất nhiên, có thể không phải toàn bộ hàng, nếu cuộn ngang cũng có mặt.)

Tuy nhiên, tôi nghĩ điều này sẽ thất bại khi ô lớn hơn khung nhìn. Để xử lý trường hợp này, bạn thay đổi kiểm tra để kiểm tra xem đầu/cuối của giới hạn ô nằm trong phạm vi dọc của chế độ xem hay không, nhưng bỏ qua phần bên trái/phải của ô. Nó đơn giản nhất để thiết lập bên trái và chiều rộng của hình chữ nhật thành 0. Tôi cũng đã thay đổi phương thức để chỉ chỉ số hàng (không cần chỉ mục cột) và nó trả về true nếu bảng không nằm trong khung nhìn, có vẻ như để phù hợp hơn với trường hợp sử dụng của bạn.

public boolean isRowVisible(JTable table, int rowIndex) 
{ 
    if (!(table.getParent() instanceof JViewport)) { 
     return true; 
    } 

    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, 1, 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); 
    rect.setLeft(0); 
    rect.setWidth(1); 
    // Check if view completely contains the row 
    return new Rectangle(viewport.getExtentSize()).contains(rect); 
} 
+0

Vâng, giải pháp này ít nhất đã đưa tôi vào con đường bên phải, đây là những gì làm việc cho tôi: JViewport viewport = scrollPane1.getViewport(); Rectangle rect = myTable.getCellRect (rowToSelect, 1, true); nếu (! Viewport.contains (rect.getLocation())) myTable.scrollRowToVisible (rowToSelect); . . . Cảm ơn rất nhiều – Brad

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