Java Swing:选择跨多个textareas的文本

did*_*xga 2 java swing select

假设我们在JPanel中有两个JTextArea,我希望用户能够在一个选择中使用鼠标选择跨越这两个JTextArea的文本,是否可以在Swing中使用?

问候

到目前为止我尝试过:

我尝试将mouselistener添加到这些JTextArea,当mouseEnter时,我在TextArea中选择文本,并以实用方式突出显示文本.这既困难又容易出错,我想也许有更好的方法

编辑:

感谢所有的答案和建议.根据答案,我实施了一个基本的解决方案,并将其作为其他人参考的答案.:)

cam*_*ckr 5

当用户在第二个文本中选择文本时,第一个文本区域中的文本保持选中状态(文本在高亮显示)

我假设您的意思是用户在两个不同的文本区域中选择不同的文本.

默认情况下,文本组件仅在文本组件具有焦点时显示所选文本.

简单的答案是创建一个自定义Caret并覆盖该focusLost(...)方法并setSelectionVisible(true)在方法结束时调用,以确保即使文本组件没有焦点也会绘制选择.

以下是该方法的更高版本,允许您为没有焦点的文本组件指定不同的选择背景颜色(如果您愿意):

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class SelectionCaret extends DefaultCaret
{
    private static final Color SELECTION_COLOR = UIManager.getColor("TextField.selectionBackground");

    private Highlighter.HighlightPainter focusedPainter;
    private Highlighter.HighlightPainter unfocusedPainter;

    public SelectionCaret()
    {
        this(SELECTION_COLOR);
    }

    public SelectionCaret(Color unfocusedColor)
    {
        focusedPainter = new DefaultHighlighter.DefaultHighlightPainter(SELECTION_COLOR);
        unfocusedPainter = new DefaultHighlighter.DefaultHighlightPainter(unfocusedColor);

        setBlinkRate( UIManager.getInt("TextField.caretBlinkRate") );
    }

    @Override
    protected Highlighter.HighlightPainter getSelectionPainter()
    {
        return getComponent().hasFocus() ? focusedPainter : unfocusedPainter;
    }

    @Override
    public void focusGained(FocusEvent e)
    {
        setSelectionVisible(false);
        super.focusGained(e);
    }

    @Override
    public void focusLost(FocusEvent e)
    {
        super.focusLost(e);
        setSelectionVisible(true);
    }

    private static void createAndShowUI()
    {
        JTextField textField1 = new JTextField("Text Field1   ");
        JTextField textField2 = new JTextField("Text Field2   ");
        JTextField textField3 = new JTextField("Non Editable   ");
        textField3.setEditable(false);

        textField1.setCaret(new SelectionCaret());
        textField2.setCaret(new SelectionCaret());
        textField3.setCaret(new SelectionCaret());

        textField1.select(5, 11);
        textField2.select(5, 11);
        textField3.select(5, 11);
        ((DefaultCaret)textField1.getCaret()).setSelectionVisible(true);
        ((DefaultCaret)textField2.getCaret()).setSelectionVisible(true);
        ((DefaultCaret)textField3.getCaret()).setSelectionVisible(true);

        JPanel north = new JPanel();
        north.add( new JTextField("Text Field0   ") );
        north.add(textField1);
        north.add(textField2);
        north.add(textField3);

        JFrame frame = new JFrame("Selection Caret");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( north );
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码基于mKorbel在此帖子中提供的代码.