/* 
 * Copyright (c) 2004 David Flanagan.  All rights reserved. 
 * This code is from the book Java Examples in a Nutshell, 3nd Edition. 
 * It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied. 
 * You may study, use, and modify it for any non-commercial purpose, 
 * including teaching and use in open-source projects. 
 * You may distribute it non-commercially as long as you retain this notice. 
 * For a commercial use license, or to purchase the book,  
 * please visit http://www.davidflanagan.com/javaexamples3. 
 */ 
 
import java.awt.Button; 
import java.awt.FileDialog; 
import java.awt.FlowLayout; 
import java.awt.Font; 
import java.awt.Frame; 
import java.awt.Panel; 
import java.awt.TextArea; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
 
/** 
 * This class creates and displays a window containing a TextArea, in which the 
 * contents of a text file are displayed. 
 */ 
public class FileViewer extends Frame implements ActionListener { 
  String directory; // The default directory to display in the FileDialog 
 
  TextArea textarea; // The area to display the file contents into 
 
  /** Convenience constructor: file viewer starts out blank */ 
  public FileViewer() { 
    this(null, null); 
  } 
 
  /** Convenience constructor: display file from current directory */ 
  public FileViewer(String filename) { 
    this(null, filename); 
  } 
 
  /** 
   * The real constructor. Create a FileViewer object to display the specified 
   * file from the specified directory 
   */ 
  public FileViewer(String directory, String filename) { 
    super(); // Create the frame 
 
    // Destroy the window when the user requests it 
    addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
        dispose(); 
      } 
    }); 
 
    // Create a TextArea to display the contents of the file in 
    textarea = new TextArea("", 24, 80); 
    textarea.setFont(new Font("MonoSpaced", Font.PLAIN, 12)); 
    textarea.setEditable(false); 
    this.add("Center", textarea); 
 
    // Create a bottom panel to hold a couple of buttons in 
    Panel p = new Panel(); 
    p.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 5)); 
    this.add(p, "South"); 
 
    // Create the buttons and arrange to handle button clicks 
    Font font = new Font("SansSerif", Font.BOLD, 14); 
    Button openfile = new Button("Open File"); 
    Button close = new Button("Close"); 
    openfile.addActionListener(this); 
    openfile.setActionCommand("open"); 
    openfile.setFont(font); 
    close.addActionListener(this); 
    close.setActionCommand("close"); 
    close.setFont(font); 
    p.add(openfile); 
    p.add(close); 
 
    this.pack(); 
 
    // Figure out the directory, from filename or current dir, if necessary 
    if (directory == null) { 
      File f; 
      if ((filename != null) && (f = new File(filename)).isAbsolute()) { 
        directory = f.getParent(); 
        filename = f.getName(); 
      } else 
        directory = System.getProperty("user.dir"); 
    } 
 
    this.directory = directory; // Remember the directory, for FileDialog 
    setFile(directory, filename); // Now load and display the file 
  } 
 
  /** 
   * Load and display the specified file from the specified directory 
   */ 
  public void setFile(String directory, String filename) { 
    if ((filename == null) || (filename.length() == 0)) 
      return; 
    File f; 
    FileReader in = null; 
    // Read and display the file contents. Since we're reading text, we 
    // use a FileReader instead of a FileInputStream. 
    try { 
      f = new File(directory, filename); // Create a file object 
      in = new FileReader(f); // And a char stream to read it 
      char[] buffer = new char[4096]; // Read 4K characters at a time 
      int len; // How many chars read each time 
      textarea.setText(""); // Clear the text area 
      while ((len = in.read(buffer)) != -1) { // Read a batch of chars 
        String s = new String(buffer, 0, len); // Convert to a string 
        textarea.append(s); // And display them 
      } 
      this.setTitle("FileViewer: " + filename); // Set the window title 
      textarea.setCaretPosition(0); // Go to start of file 
    } 
    // Display messages if something goes wrong 
    catch (IOException e) { 
      textarea.setText(e.getClass().getName() + ": " + e.getMessage()); 
      this.setTitle("FileViewer: " + filename + ": I/O Exception"); 
    } 
    // Always be sure to close the input stream! 
    finally { 
      try { 
        if (in != null) 
          in.close(); 
      } catch (IOException e) { 
      } 
    } 
  } 
 
  /** 
   * Handle button clicks 
   */ 
  public void actionPerformed(ActionEvent e) { 
    String cmd = e.getActionCommand(); 
    if (cmd.equals("open")) { // If user clicked "Open" button 
      // Create a file dialog box to prompt for a new file to display 
      FileDialog f = new FileDialog(this, "Open File", FileDialog.LOAD); 
      f.setDirectory(directory); // Set the default directory 
 
      // Display the dialog and wait for the user's response 
      f.show(); 
 
      directory = f.getDirectory(); // Remember new default directory 
      setFile(directory, f.getFile()); // Load and display selection 
      f.dispose(); // Get rid of the dialog box 
    } else if (cmd.equals("close")) // If user clicked "Close" button 
      this.dispose(); // then close the window 
  } 
 
  /** 
   * The FileViewer can be used by other classes, or it can be used standalone 
   * with this main() method. 
   */ 
  static public void main(String[] args) throws IOException { 
    // Create a FileViewer object 
    Frame f = new FileViewer((args.length == 1) ? args[0] : null); 
    // Arrange to exit when the FileViewer window closes 
    f.addWindowListener(new WindowAdapter() { 
      public void windowClosed(WindowEvent e) { 
        System.exit(0); 
      } 
    }); 
    // And pop the window up 
    f.show(); 
  } 
} 
 
    
     
  
  |