2

があり、ノードを 1 回クリックしたときにJTreeそのメソッドが呼び出されるようにしたいと考えています。getTreeCellEditorComponent()クラスのドキュメントDefaultTreeCellEditor(私が拡張したもの) によると、「編集は、マウスのトリプル クリック、またはクリック、一時停止、クリック、および 1200 ミリ秒の遅延の後に開始されます。」シングルクリックで編集プロセスを開始できるように、この動作をオーバーライドする方法はありますか?

4

2 に答える 2

5

JTreeAPI では を推奨してい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");

補遺:使いやすさに関するこの回答も参照してください。

于 2013-03-26T11:49:19.397 に答える
4

技術的には、DefaultTreeCellEditor をサブクラス化し、そのロジックを微調整して、最初の 1 回のクリックで編集を開始できます。

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

ただし、編集を開始しないと選択できないため、ユーザビリティの癖があります。これは、意図している場合と意図していない場合があります。

于 2013-03-26T13:11:35.427 に答える