2012-04-20 61 views
8

Tôi có JTreeawt.Canvas. Khi tôi chọn nhiều đối tượng từ trong số Canvas vào objList, tôi muốn tất cả các mục được chọn sẽ được hiển thị bên trong JTree như được chọn. Điều đó có nghĩa là ví dụ nếu tôi có 2 đối tượng được chọn, cả hai đường dẫn đến thư mục gốc sẽ được mở rộng và mỗi đối tượng được chọn sẽ có một số đối tượng được chọn tương ứng là TreeNode. My JTree có TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION.Java: Làm thế nào để lập trình lựa chọn và mở rộng nhiều nút trong một JTree?

Dưới đây là một mẫu của các mở rộng funcion tôi sử dụng:

public void selectTreeNodes() { 


    HashMap <String, MyEntity> entities = ...; 
    Iterator it = entities.keySet().iterator(); 
    while (it.hasNext()) { 

     String str = it.next().toString(); 
     MyEntity ent = entities.get(str); 

     if (ent.isSelected()) { 
      DefaultMutableTreeNode searchNode = searchNode(ent.getName()); 
      if (searchNode != null) { 

       TreeNode[] nodes = ((DefaultTreeModel) tree.getModel()).getPathToRoot(searchNode); 
       TreePath tpath = new TreePath(nodes); 
       tree.scrollPathToVisible(tpath); 
       tree.setSelectionPath(tpath); 
      } 
     } 
    } 
} 

public DefaultMutableTreeNode searchNode(String nodeStr) 
{ 
    DefaultMutableTreeNode node = null; 

    Enumeration enumeration= root.breadthFirstEnumeration(); 
    while(enumeration.hasMoreElements()) { 

     node = (DefaultMutableTreeNode)enumeration.nextElement(); 
     if(nodeStr.equals(node.getUserObject().toString())) { 

      return node;       
     } 
    } 

    //tree node with string node found return null 
    return null; 
} 

Trong trạng thái hiện tại của tôi, nếu tôi chọn một đối tượng duy nhất, nó sẽ được chọn trong JTreeTreePath của nó sẽ được hiển thị. Nhưng nếu entities có hơn 1 đối tượng được chọn, nó sẽ không hiển thị gì cả, JTree của tôi sẽ không thay đổi.

+0

* "Tôi có' JTree' và 'awt.Canvas'." * Không trộn Swing với các thành phần AWT. 'Canvas' phải là' JPanel' hoặc một hình ảnh được hiển thị trong 'JLabel'. –

+0

Tôi biết tôi không nên làm điều đó (tôi có một số vấn đề với menu chính mở rộng phía sau canvas), nhưng trong trường hợp này, kết nối duy nhất giữa chúng là mảng thực thể từ canvas được biểu diễn trong cây. Và trong GUI có một số không gian giữa chúng, vì vậy không có hại được thực hiện/ –

Trả lời

14

Bạn đang tìm kiếm TreeSelectionModel trong số JTree (sử dụng bộ nạp). Sử dụng TreeSelectionModel#setSelectionPaths cho nhiều đường dẫn. Bây giờ bạn chỉ đang thiết lập một nút do cuộc gọi tree.setSelectionPath(tpath); của bạn. Các TreeSelectionModel cũng có phương pháp để thêm/loại bỏ một lựa chọn hiện có, ... (về cơ bản tất cả mọi thứ bạn có thể cần trong tương lai).

Một phương pháp thú vị để mở rộng là phương pháp JTree#setExpandsSelectedPaths cho phép định cấu hình JTree để tự động mở rộng các đường dẫn đã chọn. Nếu bạn muốn quản lý điều này theo cách thủ công, bạn có thể sử dụng phương thức JTree#setExpandedState

+0

Cảm ơn bạn. Tôi đã bị mắc kẹt này trong nhiều tháng. – nslntmnx

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