JTextPane выделяет текст

Могу ли я выделить некоторый текст в JTextPane, начиная со значения и заканчивая другим значением, как показано ниже, но желтым цветом?

"" JTextPane выделить текст ""

Спасибо.


person xdevel2000    schedule 15.04.2011    source источник


Ответы (5)


Как часто есть несколько возможностей, в зависимости от того, что вы действительно подразумеваете под «изюминкой» :-)

Выделите, изменив любые атрибуты стиля произвольных частей текста на уровне документа, например

    SimpleAttributeSet sas = new SimpleAttributeSet();
    StyleConstants.setForeground(sas, Color.YELLOW);
    doc.setCharacterAttributes(start, length, sas, false);

Выделите с помощью Highlighter на уровне textPane:

    DefaultHighlighter.DefaultHighlightPainter highlightPainter = 
        new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
    textPane.getHighlighter().addHighlight(startPos, endPos, 
            highlightPainter);
person kleopatra    schedule 15.04.2011
comment
Является ли № 2 правильным использованием хайлайтера? Учебник по Java определяет его как предназначенный для выделения текущий выбор (цит.), который, я думаю, относится к getSelectedText(). - person ignis; 02.11.2012
comment
@ignis +1 за чтение учебника :-) Но я думаю, что он плохо сформулирован: вся его цель - добавить пользовательскую подсветку. Читайте в апи-документе Highlighter позволяет выделить фон цветными областями и его addHighlight начало/конец диапазона - person kleopatra; 02.11.2012

https://web.archive.org/web/20120530071821/http://www.exampledepot.com/egs/javax.swing.text/style_HiliteWords.html

JTextArea textComp = new JTextArea();

// Highlight the occurrences of the word "public"
highlight(textComp, "public");

// Creates highlights around all occurrences of pattern in textComp
public void highlight(JTextComponent textComp, String pattern)
{
    // First remove all old highlights
    removeHighlights(textComp);

    try
    {
        Highlighter hilite = textComp.getHighlighter();
        Document doc = textComp.getDocument();
        String text = doc.getText(0, doc.getLength());
        int pos = 0;

        // Search for pattern
        // see I have updated now its not case sensitive 
        while ((pos = text.toUpperCase().indexOf(pattern.toUpperCase(), pos)) >= 0)
        {
            // Create highlighter using private painter and apply around pattern
            hilite.addHighlight(pos, pos+pattern.length(), myHighlightPainter);
            pos += pattern.length();
        }
    } catch (BadLocationException e) {
    }
}

// Removes only our private highlights
public void removeHighlights(JTextComponent textComp)
{
    Highlighter hilite = textComp.getHighlighter();
    Highlighter.Highlight[] hilites = hilite.getHighlights();
    for (int i=0; i<hilites.length; i++)
    {
        if (hilites[i].getPainter() instanceof MyHighlightPainter)
        {
            hilite.removeHighlight(hilites[i]);
        }
    }
}

// An instance of the private subclass of the default highlight painter
Highlighter.HighlightPainter myHighlightPainter = new MyHighlightPainter(Color.red);

// A private subclass of the default highlight painter
class MyHighlightPainter extends DefaultHighlighter.DefaultHighlightPainter
{
    public MyHighlightPainter(Color color)
    {
        super(color);
    }
}
person Makky    schedule 29.02.2012
comment
@Makky-Он отлично работает, и спасибо за сообщение. Но при поиске makky он выделяет только makky, но не Makky, MAKKY. Есть ли обходной путь для этой проблемы? - person John; 26.07.2012
comment
@Makky-Большое спасибо. :). Это устраняет мое первое препятствие. Еще одно препятствие — выделение двух разных слов. Я даю функцию поиска, где пользователь может искать предложение. Когда предложение ищется как фраза, все в порядке. Но когда как отдельные слова, я не могу выделить все слова по отдельности. Не могли бы вы пролить свет на это ?? - person John; 26.07.2012
comment
Привет . Рад, что помог. Не могли бы вы объяснить проблему немного больше? - person Makky; 26.07.2012
comment
@Makky- скажем, я искал первое препятствие (как фразу), тогда оно выделяет первое препятствие. Это потому, что эти 2 слова идут подряд, как фраза. Я хочу искать как первое, так и препятствие независимо друг от друга, а также выделять их. - person John; 26.07.2012
comment
@Makky- Я использую приведенный вами выше код ..;) не более того - person John; 26.07.2012
comment
давайте продолжим это обсуждение в чате - person John; 26.07.2012
comment
^ Извини, чувак, я не знаю, как это сделать. Должен быть способ. Кстати, каким может быть приложение, которое вы пытаетесь создать, я могу вам помочь @_ - person Makky; 26.07.2012

Да, вы можете использовать функции setSelectionStart и setSelectionEnd из JTextComponent, от которого наследуется JTextPane.

см. javadoc JTextComponent. setSelectionStart

person clamp    schedule 15.04.2011

Вы пробовали метод сравнения строк Java

.equalsIgnoreCase("Search Target Text")

Поскольку этот метод позволяет выполнять поиск без учета регистра строк. Это может быть билетом к тому, чего вы пытаетесь достичь.

Надеюсь, это поможет вам Макки

person John    schedule 05.04.2013

с точки зрения производительности лучше включить toUpperCase

Строковый текст = doc.getText(0, doc.getLength());

а не в цикле while

но спасибо за хороший пример.

person user667522    schedule 23.02.2014