/* * CommonWordApplet.java * Created on Feb 25, 2005 */ package word; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.net.MalformedURLException; import java.net.URL; import java.util.List; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.SwingUtilities; //7.83 //7.26 /** * An applet for search for common words. */ public final class CommonWordApplet extends JApplet implements ActionListener { private final CommonWordFinder treeFinder = new CommonWordFinder(WordBagFactory.WORD_TREE_BAG_FACTORY); private final CommonWordFinder hashFinder = new CommonWordFinder(WordBagFactory.WORD_HASH_BAG_FACTORY); private final ReaderRun READER_RUN = new ReaderRun(); private final CommonRun COMMON_RUN = new CommonRun(); private final JLabel urlLabel = new JLabel("URL: "); private final JTextField urlField = new JTextField(30); private final JLabel numWordsLabel = new JLabel("# words: "); private final JTextField numWordsField = new JTextField(3); private final JButton treeButton = new JButton("Tree-Based"); private final JButton hashButton = new JButton("Hash-Based"); private final JLabel statusLabel = new JLabel(); private final JList wordList = new JList(); private String text = null; private int numWords = 0; private CommonWordFinder finder = null; public CommonWordApplet() {} public void init() { JPanel urlPanel = new JPanel(); urlPanel.add(urlLabel); urlPanel.add(urlField); JPanel searchPanel = new JPanel(); searchPanel.add(numWordsLabel); searchPanel.add(numWordsField); searchPanel.add(treeButton); searchPanel.add(hashButton); treeButton.addActionListener(this); hashButton.addActionListener(this); JPanel statusPanel = new JPanel(); statusPanel.add(statusLabel); statusLabel.setHorizontalAlignment(JLabel.CENTER); JScrollPane wordScroll = new JScrollPane(wordList); wordScroll.setPreferredSize(new Dimension(100, 50)); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(urlPanel, BorderLayout.NORTH); contentPane.add(searchPanel, BorderLayout.CENTER); contentPane.add(statusPanel, BorderLayout.SOUTH); contentPane.add(wordScroll, BorderLayout.EAST); } public void actionPerformed(ActionEvent e) { // disable the buttons setButtonsEnabled(false); // parse the number of words entered boolean numGood = false; try { numWords = Integer.parseInt(numWordsField.getText()); if (numWords > 0) numGood = true; } catch (NumberFormatException ex) { /* numGood remain false */ } // if not a good number if (!numGood) { setButtonsEnabled(true); statusLabel.setText("# words must be a non-negative integer"); repaint(); return; } // set the finder that was selected finder = e.getSource().equals(treeButton) ? treeFinder : hashFinder; // read in the url text statusLabel.setText("Reading URL text . . ."); repaint(); SwingUtilities.invokeLater(READER_RUN); } private void setButtonsEnabled(boolean enable) { treeButton.setEnabled(enable); hashButton.setEnabled(enable); } private class ReaderRun implements Runnable { public void run() { Reader r = null; // simpler code if presume there is an error boolean error = true; try { StringBuffer sb = new StringBuffer(); URL url = new URL(urlField.getText()); r = new BufferedReader(new InputStreamReader(url.openStream())); for(int c = r.read(); c != -1; c = r.read()) { sb.append((char)c); } error = false; text = sb.toString(); statusLabel.setText("Finding common words . . ."); } catch (MalformedURLException ex) { statusLabel.setText("Malformed URL"); } catch (IOException ex) { statusLabel.setText("Error reading from URL"); } finally { if (r != null) { try { r.close(); } catch(IOException ignore) {} } } // find the common words if (error) setButtonsEnabled(true); repaint(); if (!error) SwingUtilities.invokeLater(COMMON_RUN); } } private class CommonRun implements Runnable { public void run() { statusLabel.setText("Finding common words . . . "); long startTime = System.currentTimeMillis(); List/**/ commonWords = treeFinder.findCommonWords(text, numWords); long duration = System.currentTimeMillis() - startTime; statusLabel.setText("Finished: " + (duration / 1000.0) + " seconds"); wordList.setListData(commonWords.toArray()); setButtonsEnabled(true); repaint(); } } }