2013-03-25 4 views
2

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

+1

hmm ... вы можете повторно рассмотреть удобство использования одного щелчка: это триггер для un/selection – kleopatra

ответ

5

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

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"); 

Приложения: Смотрите также эту answer относительно практичности.

+1

hmmm, celebrz> 100k – mKorbel

+0

Только возможно, учась у [таких авторов, как вы!] (Http: // stackoverflow.com/tags/swing/topusers). – trashgod

+0

слишком много скромности и особенно .... перекладывание вины на других :-) – mKorbel

4

Технически, вы можете создать подкласс 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); 

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

+0

, возможно, не [см. сообщение от @Michael Dunn] (http://www.coderanch.com/t/584508/GUI/java/change-DefaultCellEditor-setClickCountToStart-int-DefaultTreeCellEditor) – mKorbel

+1

@mKorbel Мне немного надоело обходить редактор api и вручную запускать редактирование. Во всяком случае, строка _is выбрана только для нее, она немного необычна, что не может быть выбрана без редактирования. – kleopatra

+0

вопрос такой, как есть, я сомневаюсь, что ваш хороший sugestion с четкой концепцией будет принят ... – mKorbel

Смежные вопросы