# Java Notes: Example - Read Words

The program below reads a text file and lists the words alphabetically.

## GUI interface and model

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
    // File   : readwords/ReadWordsGUI.java
    // Purpose: Read a file and display all words in it.
    // Author : Fred Swartz
    // Date   : 2005-03-10

    package readwords;

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.io.*;
    import java.util.*;

    class ReadWordsGUI extends JPanel {

        //... Instance variables
        JTextArea    m_wordListTA  = new JTextArea(25, 15);
        JFileChooser m_fileChooser = new JFileChooser();

        ArrayList<String> m_words = new ArrayList<String>();

        //======================================================== constructor
        ReadWordsGUI() {
            JButton openButton = new JButton("Open");

            //... Add listeners
            openButton.addActionListener(new OpenAction());

            //... Layout components
            this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
            this.add(openButton);
            this.add(new JScrollPane(m_wordListTA));
        }

        /////////////////////////////////////////////////// inner listener class
        class OpenAction implements ActionListener {
            public void actionPerformed(ActionEvent ae) {
                int retval = m_fileChooser.showOpenDialog(ReadWordsGUI.this);
                if (retval == JFileChooser.APPROVE_OPTION) {
                    File file = m_fileChooser.getSelectedFile();
                    try {
                        Scanner wordScanner = new Scanner(file);
                        wordScanner.useDelimiter("[^A-Za-z]+");
                        while (wordScanner.hasNext()) {
                            m_words.add(wordScanner.next());
                        }

                        //... Sort the words alphabetically.
                        Collections.sort(m_words);

                        //... Clear the text area and add words.
                        m_wordListTA.setText("");
                        for (String w : m_words) {
                            m_wordListTA.append(w);
                            m_wordListTA.append("\n");
                        }
                    } catch (FileNotFoundException fnfex) {
                        System.out.println("Impossible?");
                    }
                }
            }
        }
    }

## The standard main program

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
    // File   : readwords/ReadWord.java
    // Purpose: Read a file and display all words in it.
    // Author : Fred Swartz
    // Date   : 2005-03-10

    package readwords;

    import javax.swing.*;

    public class ReadWords {
        public static void main(String[] args) {
            JFrame window = new JFrame("Read Words");
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            window.setContentPane(new ReadWordsGUI());
            window.pack();
            window.setVisible(true);
        }
    }

## Programming Problem

Sort buttons. Add two buttons to this user interface. One of them will sort the words alphabetically (as is currently done), and the other will sort the words by length. The GUI will then have three buttons and the text area. You might want to choose a different layout.

Comparator. Because Strings have a natural alphabetic sorting order, the `Collections.sort()` method doesn't need a Comparator for alphabetizing words. Sorting by word length will require writing a simple Comparator. Implementing the Comparator interface means defining the int `compare` method which compares two objects and returns a value less than zero if the first is less than the second, zero if they are equal, and a number greater than zero if the second is greater than the first.

Loops. The current code uses the Java 5 for loop for going over the list of words and adding them to the text area. The button listeners will have to do something similar. However, for practice, write each of the loops using a different technique (one using an index, and one using an Iterator).