Java JTextPane中的字母在延迟后上色
我有一个简单的文本编辑器,它把JAVA关键字涂成蓝色。代码如下:Java JTextPane中的字母在延迟后上色,java,swing,keylistener,jtextpane,Java,Swing,Keylistener,Jtextpane,我有一个简单的文本编辑器,它把JAVA关键字涂成蓝色。代码如下: class MainPanel extends JPanel { private int WIDTH = 800; private int HEIGHT = 500; private JFrame frame; private JTextPane codePane = new JTextPane(); private StyledDocument doc = codePane.getSty
class MainPanel extends JPanel {
private int WIDTH = 800;
private int HEIGHT = 500;
private JFrame frame;
private JTextPane codePane = new JTextPane();
private StyledDocument doc = codePane.getStyledDocument();
MainPanel(JFrame frame) {
this.frame = frame;
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setLayout(new BorderLayout());
JScrollPane scroll = new JScrollPane(codePane);
add(scroll, BorderLayout.CENTER);
codePane.addKeyListener(new MainPanel.KeyHandler());
codePane.setFont(new Font("Monospaced", Font.PLAIN, 15));
//Loading key words..
//...
}
private class KeyHandler extends KeyAdapter {
@Override
public void keyTyped(KeyEvent ev) {
String code = codePane.getText();
SimpleAttributeSet set = new SimpleAttributeSet();
StyleConstants.setForeground(set, Color.BLACK);
doc.setCharacterAttributes(0, code.length(), set, true);
//Change keywords color
int lastIndex = 0;
for (int a = 0; a < words.length; a++) {
set = new SimpleAttributeSet();
if (Arrays.asList(keywords).contains(words[a])) {
StyleConstants.setForeground(set, Color.BLUE);
}
doc.setCharacterAttributes(lastIndex, words[a].length(), set, true);
lastIndex += words[a].length() + 1; //+1 bo jeszcze spacja po słowie
}
}
}
}
class主面板扩展了JPanel{
私有整数宽度=800;
私人室内高度=500;
私有JFrame;
私有JTextPane codePane=新JTextPane();
私有StyledDocument doc=codePane.getStyledDocument();
主面板(JFrame){
this.frame=frame;
setPreferredSize(新尺寸(宽度、高度));
setLayout(新的BorderLayout());
JScrollPane scroll=新的JScrollPane(代码窗格);
添加(滚动、边框布局、居中);
addKeyListener(新的MainPanel.KeyHandler());
setFont(新字体(“等距”,Font.PLAIN,15));
//正在加载关键字。。
//...
}
私有类KeyHandler扩展了KeyAdapter{
@凌驾
public void keyTyped(KeyEvent ev){
String code=codePane.getText();
SimpleAttributeSet=新的SimpleAttributeSet();
setForeground(set,Color.BLACK);
doc.setCharacterAttributes(0,code.length(),set,true);
//更改关键字颜色
int lastIndex=0;
for(int a=0;a
我的问题是,文本突出显示(在键入事件中)发生在将字母放入文本区域之前。所以当我输入:“int”时,它不会把它涂成蓝色,但当我再输入一个字符时,“int”将被涂成蓝色,例如“intR”,“int”将被涂成蓝色,R字母将被涂成黑色。如何预防?一种解决方案是将keyTyped替换为keyReleased,但我不能这样做,因为我计划在按下ENTER和TAB时做一些事情,并且我需要对它们使用consume方法,这在keyReleased上不起作用。您好,这是从Jtextfield回显字符串的方式
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class FrmPrueba extends JFrame {
public FrmPrueba() {
setTitle("Prueba de pintado");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 300);
setLookAndFeel();
JTextField jTextField = new JTextField();
add(jTextField);
jTextField.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
System.out.print(e.getKeyChar());
}
});
setLocationRelativeTo(null);
}
private void setLookAndFeel() {
try {
UIManager.setLookAndFeel(new javax.swing.plaf.nimbus.NimbusLookAndFeel());
} catch (UnsupportedLookAndFeelException e) {
}
}
public static void main(String[] args) {
FrmPrueba frmPrueba = new FrmPrueba();
frmPrueba.setVisible(true);
}
}
一种解决方案是将keyTyped替换为keyReleased
不要使用KeyListener。您应该使用DocumentListener。有关详细信息,请参见上的Swing教程部分
我计划在输入和制表符的同时做一些事情
您应该使用键绑定。查看上面链接中的目录,您将找到一个关于如何使用键绑定的部分