Как подсчитать, сколько слов в текстовой области в программе Java GUI

Я пытаюсь создать программу, которая считает, сколько слов в текстовом файле. Моя цель состоит в том, чтобы как только текст был виден в textArea, он мог подсчитать все слова в нем.

Мой код для открытия файлов .txt таков:

Action Open = new AbstractAction("Open File") {
        @Override
        public void actionPerformed(ActionEvent e) {

            if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
                openFile(fc.getSelectedFile().getAbsolutePath());
            }
        }
    };

    public void openFile(String fileName) {
        FileReader fr = null;
        try {
            fr = new FileReader(fileName);
            textArea.read(fr, null);
            fr.close();
            setTitle(fileName);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Я видел, как люди выводили отдельные слова в консоль, например = 11, но я хочу заменить текст в textArea на "fileName has x number of words"

Добро пожаловать в Stack Overflow! Пожалуйста, возьмите тур, осмотритесь и прочитайте центр помощи, в частности Как мне задать хороший вопрос? и Какие темы я могу задать здесь?. Из этой второй ссылки: «Вопросы с просьбой о помощи в домашнем задании должны включать краткое изложение работы, которую вы проделали до сих пор для решения проблемы, и описание трудностей, с которыми вы ее решаете».

Timothy Truckle 14.05.2018 22:05

Используйте DocumentFilter

MadProgrammer 14.05.2018 22:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
1 543
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Сначала получить значение из текстового поля

String text=textArea.getText ();

Теперь используйте функцию длины, чтобы получить длину строки.

int countWord=text.length();

Теперь распечатайте в консоли

System.out.println ("No of Words : "+countWord);

Это будет количество символов

MadProgrammer 14.05.2018 22:17
Ответ принят как подходящий

Обновлено

Вдруг сообразил, что, возможно, я воспринял вопрос буквально

Возможно, вы имели в виду нечто большее, похожее на ...

String text = // Text from the file...

int letterCount = text.length();
int wordCount = text.split("\\s").length;
String result = "[insert file name here] has " + letterCount + " characters and " + wordCount + " words";

// A JTextArea you created eailer
textArea.setText(result);

Оригинальный ответ

but what I want is to replace the text in the textArea with "fileName has x number of words"

Я не совсем уверен, что вы имеете в виду, но ...

Лучшим местом для начала (для этого требования) будет DocumentFilter.

Это позволит вам отфильтровать текст, примененный к Document / JTextArea, и заменить его любым текстом, который вы хотите.

Может что-то вроде этого ...

public class WordCounterDocumentFilter extends DocumentFilter {

    @Override
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
        int letterCount = text.length();
        int wordCount = text.split("\\s").length;
        String result = "[insert file name here] has " + letterCount + " characters and " + wordCount + " words";
        super.replace(fb, 0, fb.getDocument().getLength(), result, attrs);
    }

}

Который затем мог бы использовать что-то вроде этого ...

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());
            JTextArea ta = new JTextArea(10, 20);
            add(new JScrollPane(ta));
            ta.setEditable(false);

            ((AbstractDocument)ta.getDocument()).setDocumentFilter(new WordCounterDocumentFilter());
            ta.setText("This is a bunch of text");
        }

    }

    public class WordCounterDocumentFilter extends DocumentFilter {

        @Override
        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
            int letterCount = text.length();
            int wordCount = text.split("\\s").length;
            String result = "[insert file name here] has " + letterCount + " characters and " + wordCount + " words";
            super.replace(fb, 0, fb.getDocument().getLength(), result, attrs);
        }

    }

}

Что выведет что-то вроде этого ...

Example output

// Решил сделать вот так, но // при отсутствии строк читает как одну строку private void countWords() {String text=textArea.getText ();int countWord=text.split("\\s").length;textArea.setText("Number of Words : "+countWord);

Peter Djon 14.05.2018 23:49

Последний вопрос, когда я пытаюсь подсчитать и пустое поле, он все равно считает, как я могу это исправить. Я имею в виду, что попробуйте посчитать его без текста, и он выдает 1.

Peter Djon 15.05.2018 01:19

Сначала обрежьте String от начальных / конечных пробелов (String#trim), затем проверьте длину полученного String, если это 0, то в нем нет слов

MadProgrammer 15.05.2018 01:31

Если вы используете \ s + вместо \ s в качестве регулярного выражения, оно не будет считать новые строки, что даст вам более точный результат.

Tymek 08.04.2020 20:53

@Tymek Нужны диски должны, но поскольку сам вопрос был несколько расплывчатым, таков и ответ;)

MadProgrammer 08.04.2020 23:01

Другие вопросы по теме