Ошибка имен узлов TreeView

У меня много проблем с TreeView, точнее с текстом, отображаемым для каждого узла.

Начав с инициализатора для Дерева, где я ожидал один узел с текстом, это может сделать программу более интуитивно понятной для пользователей:

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

и я добавляю инициализацию дерева:

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

"Relatórios Individuais" не отображаются, Tree Ok, еще одна ошибка

Я проигнорировал эту проблему и продолжил фактическое заполнение узлов, пользователь указывает свой поиск и нажимает «ОК», вот когда мы получаем заполненное дерево, 2-е изображение.

Но потом приходит еще одна странная проблема, если еще раз нажать "ок", некоторые тексты идут странно, 3-е изображение.

Вот часть 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);

Это правильный способ определить содержимое дерева?

Редакт.: Кнопка OK:

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

person Felipe Hogrefe Bento    schedule 06.12.2016    source источник
comment
Вы показали здесь код кнопки OK? Я не вижу этого.   -  person Michael    schedule 06.12.2016
comment
Я не показывал, потому что думал, что это не имеет значения, сейчас добавлю :D   -  person Felipe Hogrefe Bento    schedule 06.12.2016
comment
Я подозреваю, что проблема связана с вашим средством визуализации ячеек дерева. Этому подозрению способствует использование вами нулевого макета. Если вы устанавливаете размер каждого JCheckBox явно, это объясняет поведение, которое вы видите. Пожалуйста, включите код, который настраивает визуализатор ячеек дерева.   -  person VGR    schedule 06.12.2016
comment
Да, может в этом и проблема, раньше не задумывался об этом. Я опубликую код как редактирование. В любом случае, если это действительно проблема, лучше создавать новый TreeView при каждом поиске или переопределять текущий?   -  person Felipe Hogrefe Bento    schedule 06.12.2016


Ответы (1)


Итак, для первой задачи решение:

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

Я просто должен был уведомить, что узел изменился.

Для проблемы усечения,

cbt.setLargeModel(true);

сделал трюк.

person Felipe Hogrefe Bento    schedule 07.12.2016