【问题标题】:Highlight all words in jTextField that the user puts into search for突出显示用户搜索的 jTextField 中的所有单词
【发布时间】:2020-07-12 12:26:27
【问题描述】:

嘿,下面的所有代码都适用于突出显示要搜索的提供的单词,但如果句子中的单词不止一 (1) 个,则它不会找到它。它只会在找到一 (1) 个匹配项时停止。

private JFrame frame;
private static JTextField textField;
private static JTextField txtWorld;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                CaretDemo window = new CaretDemo();
                window.frame.setVisible(true);

                String text = "hello world. How are you?";

                textField.setText(text);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

public CaretDemo() {
    initialize();
}

private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    textField = new JTextField();
    textField.setBounds(21, 11, 350, 36);
    frame.getContentPane().add(textField);
    textField.setColumns(10);

    txtWorld = new JTextField();
    txtWorld.setColumns(10);
    txtWorld.setBounds(21, 156, 350, 36);
    frame.getContentPane().add(txtWorld);

    JButton btnNewButton = new JButton("New button");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            Highlighter highlighter = textField.getHighlighter();
            HighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(Color.pink);          
            int p0 = textField.getText().indexOf(txtWorld.getText());
            int p1 = p0 + txtWorld.getText().length();

            try {
                highlighter.removeAllHighlights();
                highlighter.addHighlight(p0, p1, painter);
            } catch (BadLocationException e) {
                e.printStackTrace();
            }
        }
    });

    btnNewButton.setBounds(221, 203, 128, 29);
    frame.getContentPane().add(btnNewButton);
}

上面的代码在运行并提供单词“world”进行查找时看起来像这样。

但是现在如果我添加到句子中并添加另一个“世界”然后点击按钮,这就是它的样子:

如您所见,它仍然有相同的突出显示的单词,但没有同时突出显示第二 (2) 个“世界”。

更新 1

我尝试使用正则表达式来循环查找所需的单词。

btnNewButton_3.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
        System.out.println("hi");
        String theSentence = txtTheSentence.getText();
        String WordToFind = txtWordToFind.getText();
        Highlighter h = txtWordToFind.getHighlighter();

        Pattern pattern = Pattern.compile("\\b"+WordToFind+"\\b", Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(theSentence);

        if(matcher.find()){
            String extractedWord = matcher.group(0);
            System.out.println(extractedWord);
        }
    }
});

但这并没有找到一个单词。

【问题讨论】:

标签: java eclipse swing jtextfield jtextarea


【解决方案1】:

终于明白了!

btnNewButton_3.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        System.out.println("hi");
        String theSentence = txtTheSentence.getText();
        String theWord = txtWordToFind.getText();
        Highlighter h = txtWordToFind.getHighlighter();
        Pattern pattern = Pattern.compile(theWord, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(theSentence);

        while (matcher.find()) {
            String extractedWord = matcher.group();
            System.out.println(extractedWord);
        }
}

【讨论】:

  • 这不是答案。它不做任何突出显示。
【解决方案2】:

它仍然有相同的突出显示的单词,但没有突出显示第二 (2) 个“世界” -

这正是您的代码所做的。

首先删除所有高光,然后添加回一个高光。

如果您想突出显示多个单词,那么您需要:

  1. 先删除所有高光,然后
  2. 编写一个循环并处理字符串中的所有文本。

找到匹配文本后,您可以使用String.indexOf(text, fromIndex) 方法从新索引继续搜索。

【讨论】:

  • 我仍然没有在任何地方看到循环。我无法帮助您使用正则表达式,因为我不知道如何使用它们。您知道如何使用 indexOf(...) 方法。你只需要做一个循环。
  • 很高兴该建议为您指明了正确的方向。不要忘记“接受”答案,这样人们就知道问题已经解决了。
猜你喜欢
  • 2012-08-04
  • 2012-06-03
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
相关资源
最近更新 更多