package cs132.markov; import java.awt.BorderLayout; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.URL; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Random; import java.util.LinkedList; import java.util.Scanner; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ScrollPaneConstants; import javax.swing.SwingUtilities; import javax.swing.UIManager; public class MarkovTextApplet extends JApplet implements ActionListener { JButton loadButton; JButton generateButton; JTextArea trainArea; JTextArea textArea; JTextField orderTextField; JTextField urlTextField; Integer order; private void CreateWordGUI() { resize(800, 400); /* Name label and textfield */ JLabel urlLabel = new JLabel("URL"); urlTextField = new JTextField(60); urlTextField.setText("http://www.cs.umd.edu/class/spring2007/cmsc132/Projects/lamb.txt"); urlTextField.addActionListener(this); JLabel orderLabel = new JLabel("Markov Order"); orderTextField = new JTextField(3); orderTextField.setText("1"); orderTextField.addActionListener(this); /* Adding buttons */ loadButton = new JButton("Load URL training data"); loadButton.addActionListener(this); generateButton = new JButton("Generate Markov text"); generateButton.addActionListener(this); /* Text Area for training data */ JLabel trainLabel = new JLabel("Training"); trainArea = new JTextArea(6,50); trainArea.setEditable(true); trainArea.setLineWrap(true); trainArea.setWrapStyleWord(true); JScrollPane scrollPane = new JScrollPane(trainArea, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); /* Text area to type info */ JLabel textLabel = new JLabel("Markov"); textArea = new JTextArea(6,50); textArea.setEditable(false); textArea.setLineWrap(true); textArea.setWrapStyleWord(true); JScrollPane scrollPane2 = new JScrollPane(textArea, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); // Lay out the GUI. BorderLayout layout = new BorderLayout(); Container contentPane = getContentPane(); contentPane.setLayout(layout); JPanel p1 = new JPanel(new BorderLayout()); JPanel t1 = new JPanel(new FlowLayout()); t1.add(urlLabel); t1.add(urlTextField); t1.add(loadButton); p1.add(t1,BorderLayout.NORTH); p1.add(scrollPane,BorderLayout.CENTER); p1.add(trainLabel,BorderLayout.LINE_START); JPanel p2 = new JPanel(new BorderLayout()); JPanel t2 = new JPanel(new FlowLayout()); t2.add(orderLabel); t2.add(orderTextField); t2.add(generateButton); p2.add(t2,BorderLayout.NORTH); p2.add(scrollPane2,BorderLayout.CENTER); p2.add(textLabel,BorderLayout.LINE_START); contentPane.add(p1, BorderLayout.NORTH); contentPane.add(p2, BorderLayout.CENTER); } // Called when this applet is loaded into the browser. @Override public void init() { // Execute a job on the event-dispatching thread: // creating this applet's GUI. try { SwingUtilities.invokeLater(new Runnable() { public void run() { CreateWordGUI(); } }); } catch (Exception e) { System.err.println("MarkovTextApplet didn't successfully complete"); } } private static void parseWords(String s, List words) { s = s.trim(); List theseWords = Arrays.asList(s.split("[ \t\n\r]+")); words.addAll(theseWords); } public void actionPerformed(ActionEvent e) { String trainStr = new String(); String orderStr = orderTextField.getText(); order = Integer.parseInt(orderStr); if ((order < 1) || (order > 100)) { order = 1; orderTextField.setText(order.toString()); } if ((e.getSource() == loadButton) || (e.getSource() == urlTextField)) { trainStr = trainURL(); if (trainStr != null) { trainArea.selectAll(); trainArea.setText(trainStr); } } else if (e.getSource() == trainArea) { } else if (e.getSource() == generateButton) { String output = new String(); trainArea.selectAll(); trainStr = trainArea.getText(); if (trainStr == null) { output = "No training text"; } else { LinkedList l = new LinkedList(); parseWords(trainStr,l); if ((trainStr.length() == 0) || (l.size() == 0)) { output = "No training text"; } else { MarkovText mgen = new MarkovText(order); mgen.updateMarkovTransitions(l.iterator()); Iterator markovIterator = mgen.markovIterator(new Random()); output = PublicTests.makeString(Words.characters(markovIterator)); } } textArea.selectAll(); textArea.setText(output); } } public String trainURL() { String val = new String(); String urlStr = urlTextField.getText(); URL userUrl = null; boolean UrlOnError = false; // Transform the String to a real URL try { userUrl = new URL(urlStr); } catch (Exception exc) { UrlOnError = true; } if (!UrlOnError && (userUrl != null)) { try { Scanner sc = new Scanner(userUrl.openStream()); val = new String(); while (sc.hasNextLine()) { val = val+sc.nextLine()+" "; } } catch (Exception exc) { UrlOnError = true; } } if (UrlOnError) { trainArea.selectAll(); trainArea.setText("Problem reading URL: " + urlStr); val = null; } return val; } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { new MarkovTextApplet(); } }); } /* Static block for feel and look */ /* Comment this block out and see how the feel and look changes */ /* You can also try this experiment in a Mac */ static { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { System.out.println(e.getMessage()); } } }