Как редактировать узел JTree одним щелчком мыши

У меня есть JTree, и хотел бы для его getTreeCellEditorComponent() метод, который будет вызываться, когда я щелкаю один раз по узлу. Согласно документации для DefaultTreeCellEditor class (который я расширил): "Редактирование запускается по тройному щелчку мыши или после щелчка, паузы, щелчка и задержки в 1200 миллисекунд". Есть ли способ переопределить это поведение, чтобы одним щелчком мыши можно было начать процесс редактирования?

2 ответа

JTree API рекомендует MouseListener, но связывание ключей также удобно. Этот пример вызывает startEditingAtPath() и привязывается к клавише Enter:

final JTree tree = new JTree();
tree.setEditable(true);
MouseListener ml = new MouseAdapter() {
    @Override
    public void mousePressed(MouseEvent e) {
        int row = tree.getRowForLocation(e.getX(), e.getY());
        TreePath path = tree.getPathForLocation(e.getX(), e.getY());
        if (row != -1) {
            if (e.getClickCount() == 1) {
                tree.startEditingAtPath(path);
            }
        }
    }
};
tree.addMouseListener(ml);
tree.getInputMap().put(
    KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "startEditing");

Приложение: Смотрите также этот ответ относительно удобства использования.

Технически, вы можете создать подкласс DefaultTreeCellEditor и настроить его логику, чтобы начать редактирование одним щелчком мыши:

JTree tree = new JTree();
tree.setEditable(true);
TreeCellEditor editor = 
        new DefaultTreeCellEditor(tree, (DefaultTreeCellRenderer) tree.getCellRenderer()) {
    @Override
    protected boolean canEditImmediately(EventObject event) {
        if((event instanceof MouseEvent) &&
           SwingUtilities.isLeftMouseButton((MouseEvent)event)) {
            MouseEvent       me = (MouseEvent)event;

            return ((me.getClickCount() >= 1) &&
                    inHitRegion(me.getX(), me.getY()));
        }
        return (event == null);
    }
};
tree.setCellEditor(editor);

Тем не менее, есть некоторая особенность юзабилити, так как теперь вы не можете выбирать без начала редактирования, что может быть или не быть вашим намерением.

Другие вопросы по тегам