Swing/Highlighter のバックアップ(No.12)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/Highlighter へ行く。
- 1 (2005-12-05 (月) 11:02:14)
- 2 (2005-12-16 (金) 17:21:48)
- 3 (2006-02-27 (月) 16:02:12)
- 4 (2007-03-05 (月) 01:55:16)
- 5 (2007-09-29 (土) 17:21:38)
- 6 (2007-11-28 (水) 19:12:19)
- 7 (2007-11-28 (水) 20:25:31)
- 8 (2008-08-28 (木) 02:20:11)
- 9 (2008-09-01 (月) 13:47:05)
- 10 (2009-10-16 (金) 00:12:47)
- 11 (2009-10-16 (金) 13:04:32)
- 12 (2009-10-16 (金) 17:42:07)
- 13 (2010-12-06 (月) 22:32:19)
- 14 (2013-03-21 (木) 15:53:32)
- 15 (2013-08-27 (火) 18:16:20)
- 16 (2013-08-28 (水) 12:29:27)
- 17 (2013-10-18 (金) 21:42:32)
- 18 (2014-02-04 (火) 14:58:03)
- 19 (2014-11-10 (月) 00:02:45)
- 20 (2014-11-25 (火) 03:03:31)
- 21 (2014-12-19 (金) 14:27:34)
- 22 (2015-03-20 (金) 15:21:42)
- 23 (2016-05-27 (金) 15:40:30)
- 24 (2016-05-29 (日) 23:29:19)
- 25 (2016-06-03 (金) 13:27:15)
- 26 (2017-09-13 (水) 17:57:36)
- 27 (2017-12-01 (金) 18:20:12)
- 28 (2019-04-09 (火) 20:11:24)
- 29 (2021-01-27 (水) 21:18:07)
- 30 (2023-12-31 (日) 19:27:47)
TITLE:Highlighterで文字列をハイライト
Posted by terai at 2005-12-05
Highlighterで文字列をハイライト
Highlighterを使ってテキスト中の文字列を強調表示します。
- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
public void setHighlight(JTextComponent jtc, String pattern) {
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) {}
}
解説
テキストコンポーネントからHighlighterを取得し、Highlighter#addHighlightメソッドで検索した文字列を追加していきます。
上記のサンプルでは、ハイライト色をDefaultHighlighter.DefaultHighlightPainterを使って指定しています。
参考リンク
コメント
- こんにちは。はじめまして。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{ Highlighter hilite = jtc.getHighlighter(); Document doc = jtc.getDocument(); String text = doc.getText(0, doc.getLength()); 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]); pos += pattern[i].length(); } } }catch(BadLocationException e) { e.printStackTrace(); } }
- こんばんは。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
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class HighlightTest{
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() { createAndShowGUI(); }
});
}
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);
}
}