Найдите смещение к строке в JTextPane

Я ищу быстрый способ найти строку в JTextPane и изменить там стиль, чтобы он был выделен. В настоящее время у меня есть что-то вроде этого (tpOutput - это рассматриваемая JTextPane, strSearch - строка для поиска.. duh):

int index = tpOutput.getText().indexOf(strSearch);
StyledDocument doc = tpOutput.getStyledDocument();
doc.setCharacterAttributes(i, strSearch.length(), doc.getStyle("exampleStyle") , false);

Однако, как бы красиво это ни было, если бы это работало, оно неправильно считает символы новой строки, поэтому, если я ищу текст «foobar» в

foobarTTT
abcd123
abcd123

он правильно выделил бы "foobar" в первой строке. Однако в

abcd123
abcd123
foobarTTT

это выделит «obarTT» (и следующие 2 пробела, если они существуют)

Я, вероятно, все делаю неправильно, пытаясь легко получить смещение, используя только текст. Кто-нибудь знает правильный способ сделать это?


person Zymox    schedule 16.11.2011    source источник
comment
Как это зацикливается? приведенный выше код выглядит так, как будто он найдет только первое вхождение   -  person dann.dev    schedule 17.11.2011
comment
Вы правы. Для моих целей важно только первое появление. Я неправильно привел пример, извините.   -  person Zymox    schedule 17.11.2011


Ответы (4)


Вы также можете использовать Highlighter, как описано в Как использовать Текстовые поля: еще один пример: TextFieldDemo.

person trashgod    schedule 16.11.2011

IndexOutOfBounds возможно из doc.getStyle("exampleStyle"), используя MutableAttributeSet работает для меня,

можете ли вы продемонстрировать свою проблему с IndexOutOfBounds, используя этот SSCCE

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

public class TextPaneAttributes extends JFrame {

    private static final long serialVersionUID = 1L;

    public TextPaneAttributes() {
        final JTextPane textPane = new JTextPane();
        StyledDocument doc = textPane.getStyledDocument();
        final MutableAttributeSet standard = new SimpleAttributeSet();
        StyleConstants.setAlignment(standard, StyleConstants.ALIGN_CENTER);
        doc.setParagraphAttributes(0, 0, standard, true);
        MutableAttributeSet keyWord = new SimpleAttributeSet();
        StyleConstants.setForeground(keyWord, Color.red);
        StyleConstants.setItalic(keyWord, true);
        textPane.setText("one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\n");
        doc.setCharacterAttributes(0, 3, keyWord, false);
        doc.setCharacterAttributes(19, 4, keyWord, false);
        try {
            doc.insertString(0, "Start of text\n", null);
            doc.insertString(doc.getLength(), "End of text\n", keyWord);
        } catch (Exception e) {
        }
        final MutableAttributeSet selWord = new SimpleAttributeSet();
        StyleConstants.setForeground(selWord, Color.blue);
        StyleConstants.setItalic(selWord, true);
        JScrollPane scrollPane = new JScrollPane(textPane);
        scrollPane.setPreferredSize(new Dimension(200, 200));
        add(scrollPane);

        JToggleButton toggleButton = new JToggleButton("where is 'four'");
        toggleButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                //AbstractButton abstractButton = (AbstractButton) actionEvent.getSource();
                //boolean selected = abstractButton.getModel().isSelected();
                int index = textPane.getText().indexOf("four");
                StyledDocument doc = textPane.getStyledDocument();
                doc.setCharacterAttributes(index, 4, selWord, false);
            }
        });
        add(toggleButton, BorderLayout.SOUTH);
    }

    public static void main(String[] args) {
        Runnable doRun = new Runnable() {

            @Override
            public void run() {
                TextPaneAttributes frame = new TextPaneAttributes();
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(doRun);
    }
}
person mKorbel    schedule 16.11.2011

мое предположение: возможно, есть разница в том, какие символы новой строки используются в JTextPane и StyledDocument, скажем, JTextPane использует \n, а StyledDocument использует \r\n

person xmoex    schedule 16.11.2011
comment
+1, да, это может быть проблемой при использовании JTextPane. Дополнительную информацию и решение. - person camickr; 17.11.2011

Я наблюдал то же самое и использовал этот код для настройки:

  private int countCarrierReturns(StringBuilder sb, int end) {
        final String cr = "\r";
        int lines = 0;
        int init = sb.indexOf(cr, 0);

        if (init == -1) {
            return 0;
        }

        while (init < end) {
            lines++;

            init = sb.indexOf(cr, init + 1);
        }

        return lines;
    }

'int end' - мой первый символ, к которому применен стиль.

person Marcus Becker    schedule 31.12.2012