Как отключить возможность выделения в JTextArea - PullRequest
0 голосов
/ 18 июня 2020

Ищу способ отключить возможность выделения в JTextArea.

В настоящее время это моя JTextArea:

textArea1 = new JTextArea();
textArea1.setBorder(BorderFactory.createLineBorder(Color.black, 1));
DefaultCaret caret = (DefaultCaret) textArea1.getCaret(); // this line and the line below was inspired by a comment found here: https://stackoverflow.com/questions/15623287/how-to-always-scroll-to-bottom-of-text-area
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
textArea1.setEditable(false);
JScrollPane scrollPane1 = new JScrollPane(textArea1);

Я использую класс DefaultCaret, чтобы всегда иметь точку обзора JTextArea, всегда перемещаемую вниз, и textArea1.setEditable(false), чтобы конечные пользователи не могли введите что-нибудь.

Однако, если я выделю текст, метод DefaultCaret просто перестанет работать. Как только вы выделите текст, JTextArea больше не будет прилипать к низу.

1 Ответ

1 голос
/ 18 июня 2020

После того, как вы выделите текст, JTextArea больше не будет прилипать к низу.

Проблема в том, что автоматическая c прокрутка будет происходить только тогда, когда курсор находится в конце документа.

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

Итак, если вы хотите, чтобы автоматическая c прокрутка была всегда включена, правильным решением будет удаление MouseListener и MouseMouseMotionListener из текстовой области, чтобы предотвратить все действия, связанные с мышью.

Или, как простой прием, вы всегда можете сбросить положение курсора в документе:

textArea.addMouseListener( new MouseAdapter()
{
    @Override
    public void mouseReleased(MouseEvent e)
    {
        JTextArea textArea = (JTextArea)e.getSource();
        textArea.setCaretPosition(textArea.getDocument().getLength());
    }
});

Изменить:

Предположим, у вас есть несколько текстовых областей для одинаковой функциональности. Вам не нужно создавать собственный слушатель для каждой текстовой области. Слушателем можно поделиться. Код может быть записан как:

    MouseListener ml = new new MouseAdapter()
    {
        @Override
        public void mouseReleased(MouseEvent e)
        {
            JTextArea textArea = (JTextArea)e.getSource();
            textArea.setCaretPosition(textArea.getDocument().getLength());
        }
    };

    textArea1.addMouseListener(ml);
    textArea2.addMouseListener(ml);
...