Узел JTree не обновляется после использования пользовательского DefaultTreeCellRenderer - PullRequest
1 голос
/ 12 июня 2019

У меня есть JTree и JtextField, поэтому я добавил слушателей в текстовое поле, чтобы при нажатии клавиши Enter узел обновлялся именем, введенным в поле.

Это работает нормально, проблема возникает, когда я использую пользовательский DefaultTreeCellRenderer для рендеринга отключенных узлов. После этого мне нужно вручную щелкнуть узел, чтобы увидеть появление изменения.

Я попробовал reload (), nodeChanged (), но без изменений.

Панель JTree:


  public class RuleTree extends JPanel {
    private static JTree autoscoreRuleTree;
    private static DefaultTreeModel treeModel;


renameRule(){
    /*
        Code given below
    */
}

newRule(){
    /*
        Creates a new rule
    */
}

copyRule(){
    /*
        Copies a rule
    */
}

disableRule(){
    /*
        disables a rule codee given below
    */
}


Класс текстового поля:

public class RuleNamePanel extends JPanel {
    private static JLabel ruleName;
    private static JTextField ruleNameTextField;

    /* To rename on pressing enter*/
            ruleNameTextField.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    RuleTree.renameRule(ruleNameTextField.getText());
                }
            }
        });

Класс рендеринга: (Правило - это пользовательский класс)

public class AutoScoreRuleTreeRenderer extends DefaultTreeCellRenderer {
    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean exp, boolean leaf,
            int row, boolean hasFocus) {
        super.getTreeCellRendererComponent(tree, value, sel, exp, leaf, row, hasFocus);
        Rule rule = (Rule) ((DefaultMutableTreeNode) value).getUserObject();
        this.setEnabled(rule.isActivated());

        return this;
    }

}

И это вызывается, когда я нажимаю ввод в текстовом поле

public static void renameRule(String name) {
        TreePath nodeToRename = autoscoreRuleTree.getSelectionPath();
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) nodeToRename.getLastPathComponent();
        Rule rule = (Rule) node.getUserObject();
        rule.setName(name);
        treeModel.nodeChanged(node);
    }

Панель кнопок

public class RuleModifyButtonPanel extends JPanel {

    private JButton newRuleButton;
    private JButton newChildButton;
    private JButton duplicateRuleButton;
    private JButton cutRuleButton;
    private JButton pasteRuleButton;
    private JButton disableRuleButton;

    /*
    Each button calls a method when clicked
    */

        //When disable button is pressed this will internally call enableNode method
        disableRuleButton.addActionListener(e -> RuleTree.disableRule()); 

    }

Отключить метод узла

    private static void enableNodes(DefaultMutableTreeNode node, boolean enable) {
        autoscoreRuleTree.setCellRenderer(new AutoScoreRuleTreeRenderer());
        enablePanels(enable);
        Rule rule = (Rule) node.getUserObject();
    }

Ожидается, что изменится при вводе, но изменится, когда я вручную нажму на дерево.

Перед использованием render: Введите имя > Нажатие Введите

После использования рендера: Введите имя после рендера > Нажмите Enter > Нажмите вручную

...