2012-02-29 19 views
8

Tôi biết (tôi đã xem các nguồn;)) sắp xếp trên JXTreeTable đã bị tắt.Cách tạo một JXTreeTable sắp xếp các phần tử hàng đầu của nó

Tuy nhiên, tôi muốn cho phép sắp xếp trên tất cả các cột chỉ dựa trên giá trị của con trực tiếp của nút gốc.

Nói rằng tôi có một cấu trúc như thế này:

Name  /Date  /File UID 
(Root) 
|- Mr. X /1996/10/22/AE123F6D 
|--- File1/2012/01/10/DFC2345Q 
|--- File2/2012/01/11/D321FEC6 
|- Mrs. Y/1975/03/03/G2GF35EZ 
|--- File3/2012/02/29/35GERR32 
|--- File4/2012/01/22/LKJY2342 
. 
. 
.

Những gì tôi muốn đạt được sắp xếp trên 3 cột chỉ trên các nút cấp độ đầu tiên. Nói rằng tôi muốn sắp xếp nó theo ngày tăng dần, nó sẽ kết thúc như thế:

Name  /Date  /File UID 
(Root) 
|- Mrs. Y/1975/03/03/G2GF35EZ 
|--- File3/2012/02/29/35GERR32 
|--- File4/2012/01/22/LKJY2342 
|- Mr. X /1996/10/22/AE123F6D 
|--- File1/2012/01/10/DFC2345Q 
|--- File2/2012/01/11/D321FEC6 
. 
. 
.

Như tôi đã nhìn thấy nó, nó ressembles để bàn đơn giản sắp xếp (để hạn chế phân cấp gọi cho việc vô hiệu hóa phân loại được nâng lên).

tôi thấy 2 khả năng để làm điều đó:

  1. Kích hoạt lại các cơ chế sắp xếp sẵn trong JXTable được hưởng lợi từ tất cả những gì đã được thực hiện (sorter, phân loại bằng cách nhấp vào tiêu đề, ...) và chỉ sắp xếp các nút của cấp độ đầu tiên (vì con cái của chúng vẫn sẽ có cùng một cha mẹ).
  2. Thực hiện các công cụ cơ bản tôi cần (sắp xếp bằng cách nhấp vào các tiêu đề chủ yếu), có danh sách các mô hình hàng-id trong JXSortableTreeModel mà tôi sắp xếp và ghi đè convertRowIndexToModel cho phép (tôi nghĩ) hiển thị mục của tôi được sắp xếp như tôi muốn.

Yêu thích của tôi dĩ nhiên là cái đầu tiên nhưng tôi không biết cách đạt được nó. Giới hạn đầu tiên là tôi không biết cách kích hoạt lại sắp xếp như JXTreeTable ghi đè setSortable() (và tất cả các phương thức liên quan) và tôi không biết cách trực tiếp truy cập vào việc thực hiện phương thức trong JXTable (đó là một vấn đề Java). Tôi có thể chỉ cần sao chép mã của JXTreeTable và loại bỏ các ghi đè nhưng đó không phải là một tùy chọn theo ý kiến ​​của tôi.

Giả sử tôi giải quyết vấn đề này, làm cách nào để giới hạn sắp xếp cho các nút cấp đầu tiên? Ngay cả sau khi nhìn vào nguồn, tôi khá là không biết làm thế nào để làm điều đó.

Với điều thứ hai, tôi mất tất cả các lợi ích của mã hiện có nhưng tôi thấy một cách thiết thực để đạt được những gì tôi muốn (ít nhất là bây giờ) Ai biết nếu không muốn lọc dữ liệu trên tất cả các hàng?).

Còn cách nào khác không? Nếu không, tôi nên chọn giải pháp nào? Bất kỳ nhận xét sâu sắc nào?

Rất cám ơn trước!

Trả lời

3

maybe sorting TreeTable following way(s), bởi aephyr, btw Swing Guru này chơi với Nimbus xem và cảm nhận quá, mã cho vui Nimbus bao gồm

enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here

+0

Cảm ơn! Tôi đã duyệt các nguồn của TreeTable và tôi phải nói, điều này có vẻ đầy hứa hẹn. Tôi sẽ cố gắng để có một cái nhìn tốt hơn về nó sau này :) – ixM

+1

Giải pháp của Aephyr hoạt động tốt, nhưng mã nguồn hầu như không có tài liệu hoặc bình luận. Bản demo là một ví dụ tốt, nhưng tôi vẫn chạy vào một số ngoại lệ được ném trên EDT. Nhức đầu của việc gỡ rối và hỗ trợ những vấn đề này và tương lai trong mã như thế này là một dấu hiệu lớn đối với tôi. – Nate

+0

@nate đây là triển lãm mã bởi một trong những guru Swing tuyệt vời, kho mã cho một số diễn đàn nơi aephyr là thành viên của, không có ý tưởng về trường hợp ngoại lệ EDT cũng không vi phạm, phải có vấn đề thứ cấp từ mã của bạn :-) – mKorbel

1

tôi cố gắng làm điều đó bằng cách chơi với cấp độ nút.Đây là một phương pháp tôi đã tạo trong nút bảng cây của tôi mà kéo dài AbstractMutableTreeTableNode:

/** 
* This method recursively (or not) sorts the nodes, ascending, or descending by the specified column. 
* @param sortColumn Column to do the sorting by. 
* @param sortAscending Boolean value of weather the sorting to be done ascending or not (descending). 
* @param recursive Boolean value of weather or not the sorting should be recursively applied to children nodes. 
* @author Alex Burdu Burdusel 
*/ 
public void sortNode(int sortColumn, boolean sortAscending, boolean recursive) { 
    mLastSortAscending = sortAscending; 
    mLastSortedColumn = sortColumn; 
    mLastSortRecursive = recursive; 

    int childCount = this.getChildCount(); 
    TreeMap<Object, BRFTreeTableNode> nodeData = new TreeMap(String.CASE_INSENSITIVE_ORDER); 

    for (int i = 0; i < childCount; i++) { 
     BRFTreeTableNode child = (BRFTreeTableNode) this.getChildAt(i); 
     if (child.getChildCount() > 0 & recursive) { 
      child.sortNode(sortColumn, sortAscending, recursive); 
     } 
     Object key = child.getData()[sortColumn]; 
     nodeData.put(key, child); 
    } 

    Iterator<Map.Entry<Object, BRFTreeTableNode>> nodesIterator; 
    if (sortAscending) { 
     nodesIterator = nodeData.entrySet().iterator(); 
    } else { 
     nodesIterator = nodeData.descendingMap().entrySet().iterator(); 
    } 

    while (nodesIterator.hasNext()) { 
     Map.Entry<Object, BRFTreeTableNode> nodeEntry = nodesIterator.next(); 
     this.add(nodeEntry.getValue()); 
    } 
} 

Hy vọng điều này sẽ giúp người khác, vì tôi nghĩ rằng mở chủ đề đã figured it out.