Подсветка выделенной строки в JTextArea

Я искал способ выделить выделенную строку в JTextArea. Есть много постов о том, как выделить текст в JTextArea, но это касается только букв. Я хочу, чтобы была возможность выделить всю строку (очень похоже на то, как редактор затмения выделяет всю текущую строку, на которой вы находитесь, когда нажимаете на строку). Все посты, которые я нашел, предлагают объект Highlighter, но я не уверен, выделит ли это область без символов JTextArea. Кроме того, есть ли способ узнать, что такое выбранная строка в JTextArea? Не сколько линий, а выделенная (скажем, кто-то щелкает назад к более ранней точке). Или это очень сложный процесс для расчета?

1 ответ

Решение

Вы должны выключить слоистые блики:

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, который будет выделять текущую строку при перемещении каретки. Так что этот класс будет управлять основным моментом. То есть, когда каретка перемещается из строки в строку, предыдущая подсветка удаляется и добавляется новая подсветка.

Другие вопросы по тегам