Выделите все слова в jTextField, которые пользователь вводит в поиск - PullRequest
0 голосов
/ 31 марта 2020

Эй, весь приведенный ниже код работает с выделением поставляемого слова для поиска, но если в предложении более одного (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" для поиска.

enter image description here

Но теперь, если я добавлю к предложению и добавлю еще один «мир», то нажму на кнопку, это выглядит так:

enter image description here

Как вы видите, оно все еще имеет то же подсвеченное слово, но не выделяет второй (2) "мир".

ОБНОВЛЕНИЕ 1

У меня есть попытался использовать регулярное выражение, чтобы l oop и найти нужное слово.

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);
        }
    }
});

Но это не приводит ни к одному найденному слову.

Ответы [ 2 ]

1 голос
/ 31 марта 2020

у него все еще есть то же подсвеченное слово без выделения второго (2) "мира" -

Ну, это именно то, что делает ваш код.

Сначала вы удаляете все блики, а затем добавляете обратно один.

Если вы хотите выделить несколько слов, вам необходимо:

  1. сначала удалить все выделения, а затем
  2. написать al oop и обработать все текст в строке.

Вы можете использовать метод String.indexOf(text, fromIndex), чтобы продолжить поиск по новому индексу, как только найдете соответствующий текст.

0 голосов
/ 01 апреля 2020

Понял наконец!

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);
        }
}
...