我创建了一个具有两种不同样式的 jtextpane:一种用于数字(粉红色前景),另一种用于其余样式(黑色前景)。我在 jtextpane 中添加了一个 keylistener(我使用 KeyReleased 函数)来处理新按下的字符,但是我在编写过程中遇到了问题。场景如下:
- 文字是:你好123
- '你好'文本是黑色的,数字'123'是粉红色的。
- 现在插入符号在“1”和“2”之间,我按“a”并发生了一些奇怪的事情。
- 字符“a”变为粉红色,然后变为黑色。
为什么会在短时间内变黑?
我以这种方式处理 KeyReleased:
- 我将所有文本设置为默认样式(清洁阶段)
- 我将仅将数字更改为粉红色的前景
这是一个例子:
import java.awt.Color;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.StringTokenizer;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
public class Example extends JFrame {
JTextPane pn = new JTextPane();
public Example() {
addDefaultStyle(pn);
addNumberStyle(pn);
pn.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent arg0) {
String text = pn.getText();
pn.getStyledDocument().setCharacterAttributes(0, text.length(), pn.getStyle("default"), true);
StringTokenizer ts = new StringTokenizer(text, " ");
while(ts.hasMoreTokens()){
String token = ts.nextToken();
try{
Integer.parseInt(token);
pn.getStyledDocument().setCharacterAttributes(text.indexOf(token), token.length(), pn.getStyle("numbers"), true);
}catch(Exception e){
pn.getStyledDocument().setCharacterAttributes(text.indexOf(token), token.length(), pn.getStyle("default"), true);
}
}
}
});
getContentPane().add(pn);
setSize(400, 400);
setLocationRelativeTo(null);
setVisible(true);
}
private void addDefaultStyle(JTextPane pn){
Style style = pn.addStyle("default", null);
pn.setForeground(Color.blue);
pn.setBackground(Color.WHITE);
StyleConstants.setForeground(style, pn.getForeground());
StyleConstants.setBackground(style, pn.getBackground());
StyleConstants.setBold(style, false);
}
private void addNumberStyle(JTextPane pn){
Style style = pn.addStyle("numbers", null);
StyleConstants.setForeground(style, Color.PINK);
StyleConstants.setBackground(style, Color.WHITE);
StyleConstants.setBold(style, true);
}
public static void main(String args []){
new Example();
}
}