如何在文档侦听器

时间:2017-12-23 20:17:58

标签: java

老实说,我不知道怎么问这个问题很抱歉,如果它没有意义,但我会试着在这里解释一下。我正在创建一个用户可以输入命令的应用程序,我希望他们能够输入单词的前几个字母并让程序预测他们想要键入的内容,我已经有了处理它的代码。 / p>

private final static String[] commands = new String[] {"help", "time", "date", "again", "weather"};

public static void predictiveText() {

        commandField.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void removeUpdate(DocumentEvent e) {

            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                if (e.getOffset() + e.getLength() == e.getDocument().getLength())
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            predict(commandField);
                        }
                    });
            }

            @Override
            public void changedUpdate(DocumentEvent e) {

            }
        });

    }

    private static void predict(JTextField field) {
        String text = field.getText();

        String prediction = null;

        for (String color : commands) {
            if (color.startsWith(text) && !color.equals(text)) {
                if (prediction != null)
                    return;

                prediction = color;
            }
        }

        if (prediction != null) {
            field.setText(prediction);

            field.setCaretPosition(text.length());
            field.select(text.length(), prediction.length());
        }
    }

唯一的问题是,当我的程序使用if语句来处理命令时,它使用一个数组来检查命令是否匹配。

} else if (AssistantFrame.getCommand().equalsIgnoreCase("card") || AssistantFrame.getCommand().equalsIgnoreCase("playing card") || AssistantFrame.getCommand().equalsIgnoreCase("playingcard") || AssistantFrame.getCommand().toLowerCase().contains("pick a card") || AssistantFrame.getCommand().toLowerCase().contains("name a card") || AssistantFrame.getCommand().toLowerCase().contains("choose a card") || AssistantFrame.getCommand().toLowerCase().contains("pick a playing card") || AssistantFrame.getCommand().toLowerCase().contains("name a playing card") || AssistantFrame.getCommand().toLowerCase().contains("choose a playing card"))  {

            MiscAction.generatePlayingCard();

有没有办法获取String,检查是否已在if语句中输入命令以显示在预测文本中。或者是否有其他方法来处理命令,同时使其与预测文本一起使用?

1 个答案:

答案 0 :(得分:1)

您可以使用Trie数据结构,它更快,更清晰的代码 它不在Java标准库中,但你可以很容易地实现它,互联网上充满了例子。