2011-11-23 38 views
5

Tôi đang sử dụng phiên bản được sửa đổi một chút của ví dụ về Mặt trời JTreeTable được hỗ trợ bởi mô hình của riêng tôi. Đó sẽ là ví dụ thứ ba (đánh dấu một ở số http://java.sun.com/products/jfc/tsc/articles/bookmarks/).JTreeTable DnD con trỏ thả nhấp nháy điên

Mọi thứ hoạt động như mong đợi ngoại trừ hỗ trợ kéo và thả. Tôi muốn DnD đó là giống như những gì một cung cấp JTree. Kể từ JTreeTable là một mở rộng JTable nó cung cấp các lớp học JTable.DropLocation để xác định vị trí thả mà không cung cấp đủ thông tin khi thả công cụ vào cột kết xuất cây của JTreeTable (không có đường dẫn và không có chỉ mục con). Tôi đã giải quyết điều đó bằng cách tạo một lớp tùy chỉnh DropLocation dựa trên sự kết hợp của các phiên bản JTableJTree của nó. Tôi cũng đã sửa đổi phương pháp vẽ của lớp TreeTableCellRenderer được cung cấp bởi việc triển khai JTreeTable được đề cập để hiển thị thông tin mới này cho người dùng (hiện tại cô ấy có thể xem liệu nút mới sẽ được đặt bên trong hay trước nút đã chọn) nếu bên trong cột cây, như bạn mong đợi từ một JTree).

Có một vấn đề. Con trỏ chuột sẽ phát điên khi vị trí thả đang được hiển thị bên trong cột cây. Nó xuất hiện và sau đó biến mất một vài phần nghìn giây sau đó hoặc điều này xảy ra quá nhanh đến mức con trỏ kéo thậm chí không được hiển thị. Điều này xảy ra với ví dụ của Sun chưa sửa đổi. Tôi hoàn toàn trong bóng tối là tại sao điều này đang xảy ra. Đã tìm thấy một người khác có cùng sự cố tại số http://www.java.net/node/663106, nhưng giải pháp được cung cấp ở đó dường như đã đặt vị trí thả của thành phần thành không và không thể truy xuất được bằng phương thức JTreeTable.getDropLocation() nữa. Tôi cần điều này để chuyển đổi nó thành DropLocation sửa đổi của tôi và sau đó vẽ các công cụ dựa trên nó. Tôi rất gần với một giải pháp thích hợp cho trường hợp sử dụng của tôi mà tôi có thể nếm thử. Điều này con trỏ nhấp nháy là trở ngại duy nhất theo cách của tôi. Ý tưởng nào?

Sử dụng Java 1.6.

PS: Tôi đã quyết định tùy chỉnh JTreeTable và không cho một trong các thành phần hiện tại (như Netbeans Outline hoặc JXTreeTable) bởi vì tất cả đều có vấn đề về JTable.DropLocation và không hỗ trợ giảm trước hoặc sau nút cây đã chọn (chỉ bên trong). Nếu bạn biết về một thành phần cung cấp chức năng như vậy, tôi rất vui khi được nghe về nó.

+1

Trong bài Scriptum của câu hỏi này tôi vô cớ và cáo buộc 'org.netbeans.swing.Outline' và' JXTreeTable' không có khả năng để hỗ trợ giảm trước hoặc sau khi nút cây được lựa chọn . Điều này không đúng vì các thành phần này thực sự hỗ trợ nó. Cả hai đều gián tiếp phân lớp một JTable. Mặc dù 'JTable.DropLocation' không cung cấp thông tin đường dẫn, nhưng bạn luôn có thể lấy thông tin này thông qua hàng và cột của bảng được cung cấp bởi nó. Tôi đã biết điều này, tôi sẽ không bao giờ bận tâm lăn thành phần của riêng tôi. Tôi khuyên chống lại nó. – predi

Trả lời

7

có vẻ như một biểu hiện của lỗi lõi #6700748 (không thể xác minh, cuộc diễu hành lỗi darn đó mất độ tuổi để kết nối với ..). Vì vậy, với lý do từ việc sửa chữa trong JXTreeTable:

/** 
    * {@inheritDoc} <p> 
    * 
    * Overridden to hack around #766-swingx: cursor flickering in DnD 
    * when dragging over tree column. This is a core bug (#6700748) related 
    * to painting the rendering component on a CellRendererPane. A trick 
    * around is to let this return false. <p> 
    * 
    * This implementation applies the trick, that is returns false always. 
    * The hack can be disabled by setting the treeTable's client property 
    * DROP_HACK_FLAG_KEY to Boolean.FALSE. 
    * 
    */ 
    @Override 
    public boolean isVisible() { 
     return shouldApplyDropHack() ? false : super.isVisible(); 
    } 


    /** 
    * Returns a boolean indicating whether the drop hack should be applied. 
    * 
    * @return a boolean indicating whether the drop hack should be applied. 
    */ 
    protected boolean shouldApplyDropHack() { 
     return !Boolean.FALSE.equals(treeTable.getClientProperty(DROP_HACK_FLAG_KEY)); 
    } 
+0

Thật vậy. Đây là câu trả lời chính xác. Ghi đè TreeTableCellRenderer.isVisible() để luôn trả về false thực hiện thủ thuật. – predi

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