我正在尝试创建一个包含一种文本编辑器的JTextPane,其中特定的单词或符号具有不同的前景颜色或字体。 到目前为止,我找到了将颜色更改为单词的方法,如下所示:
import javax.swing.*;
import java.awt.*;
import javax.swing.text.*;
public class Test extends JFrame {
private int findLastNonWordChar(String text, int index) {
while (--index >= 0) {
if (String.valueOf(text.charAt(index)).matches("\\W")) {
break;
}
}
return index;
}
private int findFirstNonWordChar(String text, int index) {
while (index < text.length()) {
if (String.valueOf(text.charAt(index)).matches("\\W")) {
break;
}
index++;
}
return index;
}
public Test() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 400);
setLocationRelativeTo(null);
final StyleContext cont = StyleContext.getDefaultStyleContext();
final AttributeSet attr = cont.addAttribute(cont.getEmptySet(), StyleConstants.Foreground, Color.RED);
final AttributeSet attrBlack = cont.addAttribute(cont.getEmptySet(), StyleConstants.Foreground, Color.BLACK);
DefaultStyledDocument doc = new DefaultStyledDocument() {
private static final long serialVersionUID = 1L;
@Override
public void insertString(int offset, String str, AttributeSet a) throws BadLocationException {
super.insertString(offset, str, a);
String text = getText(0, getLength());
int before = findLastNonWordChar(text, offset);
if (before < 0) {
before = 0;
}
int after = findFirstNonWordChar(text, offset + str.length());
int wordL = before;
int wordR = before;
while (wordR <= after) {
if (wordR == after || String.valueOf(text.charAt(wordR)).matches("\\W")) {
if (text.substring(wordL, wordR).matches("(\\W)*(private|public|protected)")) {
setCharacterAttributes(wordL, wordR - wordL, attr, false);
} else {
setCharacterAttributes(wordL, wordR - wordL, attrBlack, false);
}
wordL = wordR;
}
wordR++;
}
}
};
}
public static void main(String args[]) {
new Test();
}
}
我的问题是当符号' - &gt;'的颜色时应该改变。事实上,如果我把' - &gt;'而不是“私人”或“公共”不起作用。 你能帮我找到办法吗?感谢
答案 0 :(得分:0)
检查此样本(从以前的帖子中选取):
public static void main(String[] args) {
JTextPane jtp = new JTextPane();
StyledDocument doc = jtp.getStyledDocument();
Style style = jtp.addStyle("Red coloured text", null);
StyleConstants.setForeground(style, Color.red);
try { doc.insertString(doc.getLength(), "Style text",style); }
catch (BadLocationException e){}
StyleConstants.setForeground(style, Color.blue);
try { doc.insertString(doc.getLength(), "Style text 2",style); }
catch (BadLocationException e){}
JFrame frame = new JFrame("ColourCheck");
frame.getContentPane().add(jtp);
frame.pack();
frame.setVisible(true);
}