在每个非字母数字字符处对JTextComponent中的文本进行标记

时间:2015-04-10 11:20:54

标签: java swing awt keyevent

我正在尝试为我用Java开发的文本编辑器实现自动完成功能。要实现自动完成,我需要已经输入编辑器的所有(不同的)单词。

直接实现是将JTextComponent转换为字符串然后进行标记。相反,有没有办法记住最后一个非字母数字字符的输入位置,开始记录字符串,直到输入另一个非字母数字字符,然后将这个记录的字符串添加到我的自动完成字典中的单词集? / p>

/*Contains only parts of code that is relavant to the question*/
public class Editor {
    private JFrame editorFrame;
    /*this is where text typed is shown*/
    private JTextComponent textComp;

    /*autoComplete contains all words in the entered text*/
    /*private TreeSet<String> autoComplete*/
    /*private JMenu autoCompleteMenu*/
    public static void main(String[] args) {
            Editor editor = new Editor();
            editor.Launch();
    }

    private void Launch() {
            editorFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            editorFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
            editorFrame.setVisible(true);
            editorFrame.pack();
    }

    public Editor() {
            editorFrame = new JFrame("Critter");
            JTextArea ta = new JTextArea("", 46, 115);
            ta.setLineWrap(true);
            textComp = (JTextComponent)ta;
    }
    /*
    Iam trying to implement the following
    */
    /*
        specialChars = {all special characters,space,tab}
        if typed character is in specialChars:
            while KeyEvent is alpha-numeric :
                record KeyEvent to a string
                search for this recorded string in autoComplete and create autoCompleteMenu of possible completions
                if autoCompleteMenu != null:
                    display autoCompleteMenu

        add string to autoComplete
    */
    /*I want to know how to detect the keyevent belonging to specialChars and recording the string */
}

1 个答案:

答案 0 :(得分:1)

除了键入外,还有PASTE操作,其中添加了多个char。但无论如何,您可以使用DocumentListener处理insertUpdate / removeUpdate / changedUpdate并根据新添加的内容调整您的代码。 DocumentEvent具有偏移/长度,因此您可以跟踪添加的文本。

为避免尝试在通知问题中变异,请将您的调用包装在SwingUtilities.invokeLater()