2016-12-06 2 views
0

TreeView를 다루는 데 많은 어려움을 겪고 있습니다. 노드 당 표시되는 텍스트가 더 구체적입니다.TreeView 노드 이름 도청

private void defineEmpityTree(){    
    cbt.setModel(new DefaultTreeModel(
     new DefaultMutableTreeNode("Relat\u00F3rios Individuais") { 
      { 
      } 
     } 
    )); 
} 

나는 트리를 초기화 추가 : 나는 텍스트가 하나의 노드를 예상 트리에 대한 초기화를 시작으로

, 그것은 사용자를위한 프로그램을보다 직관적으로 만들 수도

"Relatórios Individuais" aren't shown, Tree Ok, another bug

cbt = new JCheckBoxTree(); 
    defineEmpityTree(); 
    scrollPane.setViewportView(cbt); 
내가이 문제를 무시하고, 노드의 실제 작성을 계속, 사용자가 자신의 검색 및 눌러 지정 "확인" , 우리가 나무를 가득 채울 때, 두 번째 이미지.

그러나 또 다른 이상한 문제가 발생합니다. "확인"을 다시 누르면 일부 텍스트가 이상한 세 번째 이미지로 이동합니다.

노드가 생성 된 케 이드의 부분을 강조합니다. 파일 배열의 경우 각 유형의 보고서와 각 보고서의 로트에 대해 노드가 작성됩니다. 실제로는별로 중요하지 않습니다.

cbt.setModel(myTree); 

올바른 방법은 트리의 내용을 정의 할 수 있다는 것입니다
private void defineNewTree(ArrayList<File> files){ 
    DefaultMutableTreeNode dmtRoot = new DefaultMutableTreeNode("Relat\u00F3rios Individuais"); 
    DefaultMutableTreeNode dmtSubFolder = null; 
    DefaultMutableTreeNode dmtLotFolder = null; 
    int childsRoot = 0; 
    int childsSub = 0; 

    for(File f : files){ 
     String subFolder = f.getName().substring(17,f.getName().length()-4); 
     String name = f.getName(); 
     String lot = f.getName().substring(0, 3); 
     childsRoot = dmtRoot.getChildCount(); 
     boolean subFoldExists = false; 
     boolean foldLotExists = false; 
     //creatingo folder reports: 
     for(int i = 0;i<childsRoot;i++){ 
      if(dmtRoot.getChildAt(i).toString().equals(subFolder)){ 
       dmtSubFolder = (DefaultMutableTreeNode) dmtRoot.getChildAt(i);   
       subFoldExists = true; 
       i=childsRoot; 
      } 
     } 
     if(!subFoldExists){ 
      dmtSubFolder = new DefaultMutableTreeNode(subFolder); 
      dmtRoot.add(dmtSubFolder); 
     } 
     for(int j = 0;j<childsSub;j++){ 
      if(dmtSubFolder.getChildAt(j).toString().equals(lot)){ 
       dmtLotFolder = (DefaultMutableTreeNode) dmtSubFolder.getChildAt(j); 
       foldLotExists = true; 
       j=childsSub; 
      } 
     } 
     if(!foldLotExists){ 
      dmtLotFolder = new DefaultMutableTreeNode("lote "+lot); 
      dmtSubFolder.add(dmtLotFolder); 
     } 
     dmtLotFolder.add(new DefaultMutableTreeNode(name)); 

    } 
    DefaultTreeModel myTree = new DefaultTreeModel(dmtRoot); 

    cbt.setModel(myTree); 
} 

나는 진짜 문제가 있다고 생각?

편집 : 버튼 확인 :

... 
JButton btnOk = new JButton("OK"); 
btnOk.setBounds(161, 37, 49, 23); 
btnOk.setActionCommand("ok"); 
btnOk.addActionListener(buttonListener); 
panel.add(btnOk); 
... 

class ButtonListener implements ActionListener{ 
    @Override 
    public void actionPerformed(ActionEvent a) { 
     switch(a.getActionCommand()){ 
      case "ok":     
       search(); 
       self.requestFocusInWindow(); 
       break; 
      case "cancel": 
       dispose(); 
       break; 
      case "print": 
       TreePath[] tp = cbt.getCheckedPaths(); 
       for(TreePath t : tp){ 
        System.out.println(t.getLastPathComponent().toString()); 
       } 
       self.requestFocusInWindow(); 
       break; 
      default: 
       break; 
     } 
    } 
} 

private void search(){ 
    FileSeeker fs = new FileSeeker(textField.getText()); 
    ArrayList<File> files = fs.getFiles(); 

    defineNewTree(files); 
} 

편집 : CheckBoxCellRenderer :

private class CheckBoxCellRenderer extends JPanel implements TreeCellRenderer {  
    private static final long serialVersionUID = -7341833835878991719L;  
    JCheckBox checkBox;  
    public CheckBoxCellRenderer() { 
     super(); 
     this.setLayout(new BorderLayout()); 
     checkBox = new JCheckBox(); 
     add(checkBox, BorderLayout.CENTER); 
     setOpaque(false); 
    } 

    @Override 
    public Component getTreeCellRendererComponent(JTree tree, Object value, 
      boolean selected, boolean expanded, boolean leaf, int row, 
      boolean hasFocus) { 
     DefaultMutableTreeNode node = (DefaultMutableTreeNode)value; 
     Object obj = node.getUserObject();   
     TreePath tp = new TreePath(node.getPath()); 
     CheckedNode cn = nodesCheckingState.get(tp); 
     if (cn == null) { 
      return this; 
     } 
     checkBox.setSelected(cn.isSelected); 
     checkBox.setText(obj.toString()); 
     checkBox.setOpaque(cn.isSelected && cn.hasChildren && ! cn.allChildrenSelected); 
     return this; 
    }  
} 
+0

여기에 확인 버튼 뒤에 코드가 표시 되었습니까? 나는 그것을 볼 수 없다. – Michael

+0

문제가 아니라고 생각해서 표시하지 않았습니다. 지금 추가하겠습니다 : D –

+0

문제는 트리 셀 렌더러에 있다고 생각됩니다. 이 의심은 null 레이아웃을 사용하면 더욱 커집니다. 각 JCheckBox의 크기를 명시 적으로 설정하면 표시되는 동작을 설명합니다. 트리의 셀 렌더러를 설정하는 코드를 포함하십시오. – VGR

답변

0

그래서, 첫 번째 문제에 대한 해결책은 다음과 같습니다

private void defineEmpityTree(){    
    DefaultMutableTreeNode dmtn = new DefaultMutableTreeNode("Relat\u00F3rios Individuais"); 
    cbt.setModel(new DefaultTreeModel(dmtn)); 
    ((DefaultTreeModel) cbt.getModel()).nodeChanged(dmtn); 
} 

단순히 노드가 변경되었다는 것을 알려야했습니다. 잘림 문제에 대한

,

cbt.setLargeModel(true); 

트릭을했다.