如何禁用在 JTextArea 中突出显示的能力

How to disable the ability to highlight in JTextArea

我正在寻找一种方法来禁用在 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: 
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
textArea1.setEditable(false);
JScrollPane scrollPane1 = new JScrollPane(textArea1);

我使用 DefaultCaret class 始终将 JTextArea 视点一直推到底部,textArea1.setEditable(false) 以阻止最终用户输入任何内容。

但是,如果我突出显示文本,DefaultCaret 方法就会停止工作。突出显示文本后,JTextArea 将不再粘在底部。

Once you highglight the text, the JTextArea does not stick to the bottom anymore.

问题是只有当插入符位于文档末尾时才会自动滚动。

严格来说,突出显示文本并不是问题所在。问题是用户在文本区域中的任意位置单击鼠标,因为这会改变插入符号的位置。

因此,如果您希望始终启用自动滚动,正确的解决方案是从文本区域中删除 MouseListenerMouseMouseMotionListener,以防止所有与鼠标相关的 activity。

或者作为一个简单的 hack,您可以随时重置文档的插入符号位置:

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