簡體   English   中英

TreeView節點名稱錯誤

[英]TreeView nodes names bugging

我在處理TreeView時遇到很多麻煩,更具體地說是每個節點顯示的文本。

從Tree的初始化程序開始,我希望在其中帶有文本的單個節點,這可能會使程序對用戶更直觀:

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

然后添加初始化樹:

cbt = new JCheckBoxTree();
    defineEmpityTree();
    scrollPane.setViewportView(cbt);

未顯示“RelatóriosIndividuais”,Tree Ok,另一個錯誤

我忽略了這個問題,並繼續實際填充節點,用戶指定搜索並按“確定”,即當我們得到樹填充的第二張圖片時。

但是隨后又出現了另一個奇怪的問題,如果再次按下“確定”,某些文本會變得奇怪,即第三張圖片。

這是創建節點的路線的一部分。 對於文件的數組,將為每種類型的報告和每個報告批次創建節點,這並不是很重要。

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);
}

我認為真正的問題是:

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;
    }       
}

因此,第一個問題的解決方案是:

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

我只需要通知該節點已更改。

對於截斷問題,

cbt.setLargeModel(true);

做到了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM