2013-07-23 3 views
1

웹 응용 프로그램에서 Wicket 's Tree 구성 요소를 사용하고 있습니다. 그러나 빈 폴더는 파일 방식으로 표시됩니다. 그냥 이런 : 내가 사용하는 곳 enter image description hereDefaultTreeModel 및 Wicket Tree : setAsksAllowsChildren이 작동하지 않습니다.

우는 소리가 DefaultTreeModel을하고 나무이다 : 나는 할 수 있도록 folder5 설정되어 있는지 확인 해요

PDMinterface pdmI = new PDMinterface(); 
DefaultMutabletreeNode rootTreeNode = pdmI.getDocTree();   //文档树根结点,由PDM接口提供 
DefaultTreeModel treeModel = new DefaultTreeModel(rootTreeNode); 
treeModel.setAsksAllowsChildren(true); 

어린이 :

public DefaultMutableTreeNode getDocTree(){ 
    DefaultMutableTreeNode root = new DefaultMutableTreeNode(); 
    root.setAllowsChildren(true); 
    FolderNode rootFolder = new FolderNode(0, "root", "Jiajun", true); 
    root.setUserObject(rootFolder); 

    for(int i=0; i < 5; i++){ 
     DefaultMutableTreeNode newnode = new DefaultMutableTreeNode(); 
     newnode.setAllowsChildren(true); 
     FolderNode newFolder = new FolderNode(i+1, "Folder" + Integer.toString(i+1), "Jiajun", false); 
     newnode.setUserObject(newFolder); 
     root.add(newnode); 
     if(i < 4){ 
      for(int j=0; j < 5; j++){ 
       DefaultMutableTreeNode newdocNode = new DefaultMutableTreeNode(); 
       newdocNode.setAllowsChildren(false); 
       DocNode newDoc = new DocNode(10*(i+1) + j, "Document" + Integer.toString(10*(i+1)+j), "Jiajun"); 
       newdocNode.setUserObject(newDoc); 
       newnode.add(newdocNode); 
      } 
     } 
    } 

사람이 할 수있는 도움??

+0

좀 이상하게 들릴지 모르지만 필자는 필요한 개개인 구성 요소를 확장하고 코드를 조정해야만했습니다. 구성 요소의 소스 코드를 살펴보고 파일/폴더 아이콘을 설정 한 위치를 확인해 보셨습니까? 그들은 종종 아주 깨끗한 코드를 가지고 있으며 쉽게 확장하고 원하는 것을 수행하지 못하는 메서드를 재정의 할 수 있으므로 필요한 기능이나 L & F를 얻을 수 있습니다. – Martin

+0

조언 해 주시면 고맙겠습니다. – Friedmannn

+0

나는 그 원인과 방법을 찾은 답장을 추가했다. 그러나 당신은 그것에 대해 정교하고 테스트해야 할 것이다 ... – Martin

답변

1

내 의견에보다 더 도움이 될 개찰구의 트리 구성 요소에있을 것 같다, 나는 그것이 노드에 할당 어떤 이미지를 제어 할 AbstractTreeClass이 코드 발견 isLeaf() 메서드가 무엇을 반환하는지 모든 문제가 발생합니다. 나는 DefaultMutableTreeNode의 클래스에서 이것을 발견

public boolean isLeaf() 
{ 
    return children.size() == 0; 
} 

그래서, 당신의 조합 잎으로가 아닌 폴더로 자녀가없는 모든 요소를 ​​취급 할 것으로 보인다. 어쩌면 당신은 getAllowsChildren을 사용하여 getNodeIcon 메소드를 덮어 쓸 수 있습니다 ...

또 다른 아이디어는 DefaultMutableTreeNode의 isLeaf() 메소드를 덮어 쓰는 것입니다. 그러나 다른 곳에서 호출하면 다른 예기치 않은 문제가 발생할 수 있습니다. 제어 할 수없는 ...

이 당신이 그것을 ... 그것은 도움이 될 것입니다 희망 할 수있는 방법에 단지 몇 가지 통찰력이 ... 당신이
0

문제는 바깥 쪽 for 루프의 if(i < 4){ 라인에 있습니다. 노드가 자식을 가질 수는 있지만이 마지막 노드에는 자식을 만들지 않습니다.

편집 : 내 대답이 잘못되었으므로 빈 폴더가 맞습니다. 스윙에서 예상대로 작동합니다. 트리 행이 렌더링되면 폴더 또는 파일 아이콘을 그리기위한 결정은 플래그 setAsksAllowsChildren을 기반으로합니다. 그래서

/** 
* Returns the resource reference for icon of specified tree node. 
* 
* @param node 
*   The node 
* @return The package resource reference 
*/ 
protected ResourceReference getNodeIcon(TreeNode node) 
{ 
    if (node.isLeaf() == true) 
    { 
     return getItem(); 
    } 
    else 
    { 
     if (isNodeExpanded(node)) 
     { 
      return getFolderOpen(); 
     } 
     else 
     { 
      return getFolderClosed(); 
     } 
    } 
} 

: 그래서 문제가

+0

예, 그것은 비어 있지만 비어있는 폴더는 폴더가 아닙니다. – Friedmannn

+0

@Friedmannn 맞습니다. 나는 그것이 맞지 않다는 것을 언급하기 위해 나의 대답을 업데이트했다. 스윙에서 예상대로 작동합니다. 아마도 당신은 당신이 사용하는 버전과 누군가가 당신을 도울 가능성을 높이기 위해 관련 구성 요소의 초기화와 관련된 코드를 추가해야합니다. –

+0

나는 그것이 개찰의'Tree' 문제일지도 모른다고 생각합니다. 방금 스윙에서 실험을했는데 정상적으로 작동했습니다. 이제는'Tree'에 대한 대안이 없어지는지 궁금합니다. – Friedmannn

2

를 사용하고있다 개찰구 버전

? 오래된 트리 구현은 6.x에서 더 이상 사용되지 않으며 7.x에서 제거되었으므로 org.apache.wicket.extensions.markup.html.repeater.tree 패키지의 새 구현을 사용해야합니다. 더 이상 스윙을 기반으로하지 않습니다. 수업.

+0

6.x를 사용하고 있는데 협력 프로젝트를하고 있기 때문에 사용해야합니다. 어쨌든, 당신의 대답에 감사드립니다. – Friedmannn

0

Folder.getStyleClass를 재정 의하여 원하는 아이콘을 반환 할 수 있습니다. 나는 다음과 같은 것을 얻었습니다 :

    @Override 
       protected String getStyleClass() { 
        String styleClass; 
        if (isFolder(getModelObject())) 
        { 
         if (tree.getState(matter) == State.EXPANDED) 
         { 
          styleClass = getOpenStyleClass(); 
         } 
         else 
         { 
          styleClass = getClosedStyleClass(); 
         } 
        } 
        else 
        { 
         styleClass = getOtherStyleClass(matter); 
        } 

        if (isSelected()) 
        { 
         styleClass += " " + getSelectedStyleClass(); 
        } 

        return styleClass; 
       } 

귀하의 isFolder() 구현은 다를 수 있습니다.