突出显示JTextArea中的选定行

时间:2015-11-14 04:52:28

标签: java swing jtextarea swing-highlighter

我一直在寻找一种方法来突出显示JTextArea中的选定行。有很多关于如何在JTextArea中突出显示文本的帖子,但它只会到字母去。我希望能够突出整行(就像eclipse编辑器突出显示当你点击一行时你所在的整个当前行)。我发现的所有帖子都提示了Highlighter对象,但我不确定是否会突出显示JTextArea的非字符区域。另外,有没有办法找到JTextArea中所选行的内容?不是有多少行,而是所选择的行(比如有人点击回到前一点)。或者这是一个非常复杂的计算过程?

1 个答案:

答案 0 :(得分:5)

您需要关闭分层高光:

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

public class SSCCE extends JPanel
{
    public SSCCE()
    {
        JTextArea textArea = new JTextArea(4, 30);
        textArea.setText("one\ntwo\nthree");
        add( new JScrollPane(textArea) );


        DefaultHighlighter highlighter =  (DefaultHighlighter)textArea.getHighlighter();
        DefaultHighlighter.DefaultHighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter( Color.RED );
        highlighter.setDrawsLayeredHighlights(false); // this is the key line

        try
        {
            int start =  textArea.getLineStartOffset(1);
            int end =    textArea.getLineEndOffset(1);
            highlighter.addHighlight(start, end, painter );
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }


    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SSCCE());
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater( () -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}

您可能还想查看Line Painter类,它会在移动插入符号时突出显示当前行。所以这个课程将管理亮点。就像插入符号从一行移动到另一行一样,删除了上一个高亮显示并添加了一个新的高亮显示。