У меня есть 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 > Нажмите вручную