JTextPane中的字母在延迟后会着色

时间:2013-03-04 14:50:56

标签: 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.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。

2 个答案:

答案 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);

    }
}