0

我在处理 TreeView 时遇到了很多麻烦,尤其是每个节点显示的文本。

从树的初始化程序开始,我希望在其中有一个带有文本的节点,它可能会使程序对用户更直观:

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

我添加初始化树:

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

没有显示“Relatórios Individuais”,Tree 好的,另一个错误

我忽略了这个问题并继续实际填充节点,用户指定他的搜索并按“确定”,这就是我们填充树的时候,第二张图像。

但是随后另一个奇怪的问题来了,如果再次按下“确定”,一些文字会变得奇怪,第三张图片。

这是 cade 中创建节点的部分。对于为每种类型的报告和每个报告批次创建的文件节点数组,它并不重要。

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

1 回答 1

0

因此,对于第一个问题,解决方案是:

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

我只需要通知节点已更改。

对于截断问题,

cbt.setLargeModel(true);

成功了。

于 2016-12-07T13:34:57.397 回答