Как редактировать узел 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);
Тем не менее, есть некоторая особенность юзабилити, так как теперь вы не можете выбирать без начала редактирования, что может быть или не быть вашим намерением.