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

Java 如何禁用在JTextArea中突出显示的功能,java,swing,user-interface,jtextarea,Java,Swing,User Interface,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 b

我正在寻找一种方法来禁用在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.setEditablefalse阻止最终用户键入任何内容

但是,如果突出显示文本,DefaultCaret方法将停止工作。一旦高亮显示文本,JTextArea就不再粘到底部

一旦高亮显示文本,JTextArea就不再粘到底部

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

突出显示文本并不是严格意义上的问题。问题是用户在文本区域的任意位置单击鼠标,因为这将更改插入符号的位置

因此,如果您希望始终启用自动滚动,正确的解决方案是从文本区域中删除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);

此答案最初作为以下内容的副本关闭:。是的,这确实回答了题目。然而,如果你进一步阅读,你会发现真正的问题是:一旦你突出显示文本,JTextArea就不再粘在底部了-所以我打开问题,提供如何解决实际问题的建议,而不是假设问题。非常感谢你的这个camickr。事实上,我发现是用户点击了鼠标,并据此打开了另一个问题。您提供的这种方法非常有效。对此非常高兴:你能给我解释一下这个方法是如何工作的吗?我试图理解,为什么要创建另一个JTextArea,将当前textArea1分配给新创建的文本区域,而不是仅使用当前textArea1。再一次,非常感谢,这太完美了!我不是在做另一件事。我刚刚得到你点击的文本区域的引用。这是一种编写可由多个组件共享的通用侦听器的技术。请参阅编辑以获得一个简单的示例。这更有意义,非常感谢。我习惯于写匿名听众,所以我没有注意到这不是匿名的事实。真的很酷,学到了一些新东西!