3

問題があります:

        int index = text.indexOf(myWord);

        while (index >= 0) {
            int len = pattern.length();
            hl.addHighlight(index, index + len, DefaultHighlighter.DefaultPainter);
            index = text.indexOf(pattern, index + len);
        }

行末までハイライトが有効になっている場合、ハイライトを無効にするにはどうすればよいですか? 上記のコードの結果:

ここに画像の説明を入力

回答ありがとうございますが、問題は次のとおりです。

ここに画像の説明を入力

黒い線は、クリックして入力を開始した場所です。これは単なるバグです。

4

1 に答える 1

9

さて、変数名についていくつかの仮定を行う必要がありましたが、それが正しかったことを願っています。基本的にあなたのコードはうまくいきましたが、最初の行がわかりませんでした:

int index = text.indexOf(myWord);

私はそれがあるべきだと思います:

int index = text.indexOf(pattern);

とにかく、私はこのコードを書きましたが、うまくいきました:

String pattern = "<aa>";
String text = textArea.getText();        
int index = text.indexOf(pattern);
while(index >= 0){
    try {                
        hl.addHighlight(index, index + pattern.length(), DefaultHighlighter.DefaultPainter);
        index = text.indexOf(pattern, index + pattern.length());            
    } catch (BadLocationException ex) {
        ex.printStackTrace();
    }
}

アップデート

マークされたテキストの最後をクリックして入力を開始すると、テキストもマークされます。これは私のバグです。

申し訳ありませんが、私は前にそれを見ませんでした。蛍光ペンを止めることはできないと思いますが、 を使用してCaretListenerそこで作業を行うことはできます。このようにして、パターンに一致する新しい文字列を入力すると、それも強調表示されます。

textArea.addCaretListener(new CaretListener() {            
    @Override
    public void caretUpdate(CaretEvent e) {
        if(e.getMark() == e.getDot()){
            Highlighter hl = textArea.getHighlighter();
            hl.removeAllHighlights();

            String pattern = "<aa>";
            String text = textArea.getText();        
            int index = text.indexOf(pattern);
            while(index >= 0){
                try {                
                    Object o = hl.addHighlight(index, index + pattern.length(), DefaultHighlighter.DefaultPainter);
                    index = text.indexOf(pattern, index + pattern.length());
                } catch (BadLocationException ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
});

注意は、 CaretEvent.getDot()およびCaretEvent.getMark() javadoce.getMark() == e.getDot()に基づく「テキスト選択がない」ことを意味します。それ以外の場合は、選択したテキスト以外を強調表示しないでください。

スクリーンショット

ここに画像の説明を入力

更新された SSCCE

これをテストするための完全なSSCCEを次に示します。

import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;

public class Demo {

    private void initGUI(){

        final JTextArea textArea = new JTextArea();

        textArea.addCaretListener(new CaretListener() {            
            @Override
            public void caretUpdate(CaretEvent e) {
                if(e.getMark() == e.getDot()){
                    Highlighter hl = textArea.getHighlighter();
                    hl.removeAllHighlights();

                    String pattern = "<aa>";
                    String text = textArea.getText();        
                    int index = text.indexOf(pattern);
                    while(index >= 0){
                        try {                
                            Object o = hl.addHighlight(index, index + pattern.length(), DefaultHighlighter.DefaultPainter);
                            index = text.indexOf(pattern, index + pattern.length());
                        } catch (BadLocationException ex) {
                            ex.printStackTrace();
                        }
                    }
                }
            }
        });

        JScrollPane scrollPane = new JScrollPane(textArea);
        scrollPane.setPreferredSize(new Dimension(300,200));

        JPanel content = new JPanel(new FlowLayout());
        content.add(scrollPane);

        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setContentPane(content);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);        
    }


    public static void main(String[] args) {        
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Demo().initGUI();
            }
        });
    }

}
于 2013-10-17T13:46:58.223 に答える