Swing/Highlighter のバックアップの現在との差分(No.12)
TITLE:Highlighterで文字列をハイライト
Posted by terai at 2005-12-05
Highlighterで文字列をハイライト
Highlighterを使ってテキスト中の文字列を強調表示します。- category: swing folder: Highlighter title: Highlighterで文字列をハイライト tags: [JTextComponent, Highlighter] author: aterai pubdate: 2005-12-05T11:02:14+09:00 description: Highlighterを使ってテキスト中の文字列を強調表示します。 image:
概要
Highlighter
を使ってテキスト中の文字列を強調表示します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
#screenshot
サンプルコード
#spanend
#spandel
public void setHighlight(JTextComponent jtc, String pattern) {
#spanend
removeHighlights(jtc);
try{
Highlighter hilite = jtc.getHighlighter();
Document doc = jtc.getDocument();
String text = doc.getText(0, doc.getLength());
int pos = 0;
while((pos = text.indexOf(pattern, pos)) >= 0) {
hilite.addHighlight(pos, pos+pattern.length(), highlightPainter);
pos += pattern.length();
}
}catch(BadLocationException e) {}
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
jtc.getHighlighter().removeAllHighlights();
#spanend
#spanadd
try {
#spanend
Highlighter highlighter = jtc.getHighlighter();
Document doc = jtc.getDocument();
String text = doc.getText(0, doc.getLength());
Matcher matcher = Pattern.compile(pattern).matcher(text);
int pos = 0;
while (matcher.find(pos) && !matcher.group().isEmpty()) {
pos = matcher.end();
highlighter.addHighlight(matcher.start(), pos, highlightPainter);
}
#spanadd
} catch (BadLocationException | PatternSyntaxException ex) {
#spanend
ex.printStackTrace();
}
解説
テキストコンポーネントからHighlighterを取得し、Highlighter#addHighlightメソッドで検索した文字列を追加していきます。解説
- テキストコンポーネントから
Highlighter
を取得し、Highlighter#addHighlight(...)
メソッドで検索した文字列を追加 - 上記のサンプルではハイライト色を
DefaultHighlighter.DefaultHighlightPainter
を使用して設定
参考リンク
- Highlighter#addHighlight(...) (Java Platform SE 8)
- Swing - Searching text in files & highlighting that text
- JTextPaneで検索結果のハイライト表示と文字色変更を同時に行う
参考リンク
コメント
- こんにちは。はじめまして。Keithと言います。このプログラムだと、テキスト中の複数の異なる文字に、それぞれハイライトを割り当てることが出来ないのですが、解決策はあるでしょうか。 -- Keith
- こんばんは。
Highlighter#addHighlight
メソッドは、複数のハイライトを追加できるので、パターン毎に色を変えたいだけなら(効率とか、同じ文字列が含まれる場合とか、エラー処理などの面倒なことは考えない)、以下のようにパターンを配列にして繰り返すだけでもいいかもしれません。 -- aterai
- こんばんは。
コメント
- こんにちは。はじめまして。Keithと言います。このプログラムだと、テキスト中の複数の異なる文字に、それぞれハイライトを割り当てることが出来ないのですが、解決策はあるでしょうか。 -- Keith?
- こんばんは。Highlighter#addHighlightメソッドは、複数のハイライトを追加できるので、パターン毎に色を変えたいだけなら(効率とか、同じ文字列が含まれる場合とか、エラー処理などの面倒なことは考えない)、以下のようにパターンを配列にして繰り返すだけでもいいかもしれません。 -- terai
private final Highlighter.HighlightPainter[] highlightPainter = { new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW), new DefaultHighlighter.DefaultHighlightPainter(Color.CYAN) }; private final String[] pattern = {"Swing", "win"}; public void setHighlight(JTextComponent jtc, String[] pattern) { removeHighlights(jtc); try{ try { Highlighter hilite = jtc.getHighlighter(); hilite.removeAllHighlights(); Document doc = jtc.getDocument(); String text = doc.getText(0, doc.getLength()); for(int i=0;i<pattern.length;i++) { for (int i = 0; i < pattern.length; i++) { int pos = 0; while((pos = text.indexOf(pattern[i], pos)) >= 0) { hilite.addHighlight(pos, pos+pattern[i].length(), highlightPainter[i]); while ((pos = text.indexOf(pattern[i], pos)) >= 0) { hilite.addHighlight(pos, pos + pattern[i].length(), highlightPainter[i]); pos += pattern[i].length(); } } }catch(BadLocationException e) { e.printStackTrace(); } #spandel } #spanend #spandel
- こんばんは。Highlighter#addHighlightメソッドは、複数のハイライトを追加できるので、パターン毎に色を変えたいだけなら(効率とか、同じ文字列が含まれる場合とか、エラー処理などの面倒なことは考えない)、以下のようにパターンを配列にして繰り返すだけでもいいかもしれません。 -- terai
- こんな簡単にハイライトできるとは!。正規表現で実装すると開始位置と終了位置がより簡単で、しかも複雑にできるかも。 -- eternalharvest?
- ちょっと夏休みで帰省してました。正規表現 > そうですね。基本的には同じような要領で大丈夫だと思います。メモ:Swing - Content-Overlay in JTextPane -- terai
- こんにちは。Cakaiと申します。ハイライトされているテキストのカラーを設定することがありますか? -- Caokai?
- こんにちは。はじめまして。Highlighter.HighlightPainterで、文字色は変更できないかもしれません。以下のようにAttributeSetを使うのはどうでしょう。JTextPaneでキーワードのSyntaxHighlight -- terai
- 用途によっては、JEditorPaneのHTMLEditorKitにCSSを適用なども使えるかもしれません。
- こんにちは。はじめまして。Highlighter.HighlightPainterで、文字色は変更できないかもしれません。以下のようにAttributeSetを使うのはどうでしょう。JTextPaneでキーワードのSyntaxHighlight -- terai
#spanend
#spandel
import java.awt.*;
#spanend
#spandel
import javax.swing.*;
#spanend
#spandel
import javax.swing.text.*;
#spanend
#spandel
public class HighlightTest{
#spanend
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() { createAndShowGUI(); }
});
} catch (BadLocationException e) {
e.printStackTrace();
}
private static void addHighlightTest(JTextComponent textarea,
String pattern,
Highlighter.HighlightPainter painter) {
int pos = 0;
String text = textarea.getText();
try {
while ((pos = text.indexOf(pattern, pos)) >= 0) {
textarea.getHighlighter().addHighlight(
pos, pos+pattern.length(), painter);
pos += pattern.length();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static JTextArea makeTestTextArea() {
JTextArea textArea = new JTextArea();
textArea.setText("JTextArea\nRed and Blue");
addHighlightTest(textArea, "Red",
new DefaultHighlighter.DefaultHighlightPainter(Color.RED));
addHighlightTest(textArea, "Blue",
new DefaultHighlighter.DefaultHighlightPainter(Color.BLUE));
return textArea;
}
private static void addStyleTest(JTextPane textPane,
String pattern,
Color fgcolor) {
int pos = 0;
String text = textPane.getText();
StyledDocument doc = textPane.getStyledDocument();
SimpleAttributeSet sas = new SimpleAttributeSet();
StyleConstants.setForeground(sas, fgcolor);
try{
while ((pos = text.indexOf(pattern, pos)) >= 0) {
doc.setCharacterAttributes(pos, pattern.length(), sas, false);
pos += pattern.length();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static JTextPane makeTestTextPane() {
JTextPane textPane = new JTextPane();
textPane.setText("JTextPane\nRed and Blue");
addStyleTest(textPane, "Red", Color.RED);
addStyleTest(textPane, "Blue", Color.BLUE);
return textPane;
}
public static void createAndShowGUI() {
JPanel p = new JPanel(new GridLayout(2,1));
p.add(new JScrollPane(makeTestTextArea()));
p.add(new JScrollPane(makeTestTextPane()));
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(p);
frame.setSize(320, 240);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
- こんな簡単にハイライトできるとは!。正規表現で実装すると開始位置と終了位置がより簡単で、しかも複雑にできるかも。 -- eternalharvest
- ちょっと夏休みで帰省してました。正規表現 > そうですね。基本的には同じような要領で大丈夫だと思います。メモ: Swing - Content-Overlay in JTextPane、追記: DefaultHighlighterの描画方法を変更するに、
Matcher matcher = Pattern.compile(pattern).matcher(text);
と正規表現でハイライトするサンプルを追加。追記2: このサンプルでも正規表現を使用するように変更。 -- aterai
- ちょっと夏休みで帰省してました。正規表現 > そうですね。基本的には同じような要領で大丈夫だと思います。メモ: Swing - Content-Overlay in JTextPane、追記: DefaultHighlighterの描画方法を変更するに、
- こんにちは。Cakaiと申します。ハイライトされているテキストのカラーを設定することがありますか? -- Caokai
- こんにちは。はじめまして。
Highlighter.HighlightPainter
で、文字色は変更できないかもしれません。以下のようにAttributeSet
を使うのはどうでしょう。JTextPaneでキーワードのSyntaxHighlight -- aterai- 用途によっては、JEditorPaneのHTMLEditorKitにCSSを適用なども使えるかもしれません。 -- aterai
- JTextPaneで検索結果のハイライト表示と文字色変更を同時に行うにサンプルコードを移動。 -- aterai
- こんにちは。はじめまして。
- わかりました。ほんとにありがとうございました。 -- Caokai