Отключить выбор двойного щелчка в JTextComponent - PullRequest
1 голос
/ 28 февраля 2012

Как правило, при двойном щелчке в текстовом компоненте выделяется все слово.

Я хотел бы отключить выбор этого отдельного слова, но при этом сохранить возможность щелкать и перетаскивать, чтобы выделить его.

Пример: «Быстрая коричневая лиса перепрыгивает через ленивую собаку»

Когда я щелкаю и перетаскиваю от начала «The» до конца «dog», текст выделяется.Однако, когда я дважды щелкаю «коричневый», «коричневый» не выбирается, и можно выполнить другое действие.

Кто-нибудь знает, как мне этого добиться?

Ответы [ 5 ]

2 голосов
/ 29 февраля 2012

Где редактировать это экземпляр JTextComponent

DefaultCaret c=new DefaultCaret() {
    public void mouseClicked(MouseEvent e) {
        int nclicks = SwingUtilities2.getAdjustedClickCount(getComponent(), e);
        if (! e.isConsumed() &&
                SwingUtilities.isLeftMouseButton(e) &&
                nclicks == 2
                && SwingUtilities2.canEventAccessSystemClipboard(e)) {
            return;
        }

        super.mouseClicked(e);
    }
    public void mousePressed(MouseEvent e) {
        int nclicks = SwingUtilities2.getAdjustedClickCount(getComponent(), e);
        if (! e.isConsumed() &&
                SwingUtilities.isLeftMouseButton(e) &&
                nclicks == 2
                && SwingUtilities2.canEventAccessSystemClipboard(e)) {
            return;
        }
        super.mousePressed(e);
    }
};
c.setBlinkRate(edit.getCaret().getBlinkRate());
edit.setCaret(c);
2 голосов
/ 28 февраля 2012

Полагаю, вы можете зарегистрировать свой собственный MouseListener или MouseAdapter и проверить количество кликов (т. Е. getClickCount()) для MouseEvent. Если оно равно 2, swallow событие, в противном случае делегируйте обработку события суперклассу (например, super.mouseClicked(...)).

1 голос
/ 31 октября 2014

Другой способ сделать это - заменить действие selectWord действием, которое ничего не делает:

    textComponent.getActionMap().put(DefaultEditorKit.selectWordAction, 
            new TextAction(DefaultEditorKit.selectWordAction) {
                public void actionPerformed(ActionEvent e) {
                    // DO NOTHING
                }
            });

Вы также можете использовать эту технику для изменения поведения действия selectWord, если ваше определение слова отличается от определения Swing по умолчанию.

0 голосов
/ 17 августа 2017

@ Loic Ваш ответ сработал для меня. Однако я все еще хотел, чтобы выбор слова был включен, если выполняется определенное условие. Вот как я это сделал:

Action defaultSelectWordAction = textComponent.getActionMap().get(DefaultEditorKit.selectWordAction);

textComponent.getActionMap().put(DefaultEditorKit.selectWordAction, new TextAction(DefaultEditorKit.selectWordAction) {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (conditionFulfilled()) {
                defaultSelectWordAction.actionPerformed(e);
            } else {
                // DO NOTHING
            }
        }
    });
0 голосов
/ 28 февраля 2012

вы можете реализовать двойной щелчок следующим образом:

setCaretPosition(0);

Документация : указывает на устаревший метод select(int,int), который является вызовом делегата setCaretPosition, а затем moveCaretPosition

...