我有简单的文本编辑器,可以将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.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
}
}
}
}
我的问题是文本突出显示(在keyTyped事件中)在将字母放入文本区域之前发生。所以当我输入:“int”时它不会将它变成蓝色,但是当我输入一个字符时,“int”会变成蓝色,例如。 “intR”,“int”将显示为蓝色,R字母将为黑色。怎么预防呢?一个解决方案是用keyReleased替换keyTyped但是我不能这样做因为我打算在按下 ENTER 和 TAB 时做一些事情我需要使用consume方法它们不适用于keyReleased。
答案 0 :(得分:2)
一种解决方案是将keyTyped替换为keyReleased
不要使用KeyListener。您应该使用DocumentListener。有关详细信息,请参阅How to Write a Document Listener上Swing教程中的部分。
我计划在ENTER和TAB时做一些事情
您应该使用Key Bindings。请查看上面链接中的目录,您将在How to Use Key Bindings
找到一个部分。
答案 1 :(得分:0)
你知道如何从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);
}
}