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