Swing JFC Java

/*
Core SWING Advanced Programming 
By Kim Topley
ISBN: 0 13 083292 8       
Publisher: Prentice Hall  
*/
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.StyledDocument;
public class AppendingTextPane extends JTextPane {
  public AppendingTextPane() {
    super();
  }
  public AppendingTextPane(StyledDocument doc) {
    super(doc);
  }
  // Appends text to the document and ensure that it is visible
  public void appendText(String text) {
    try {
      Document doc = getDocument();
      // Move the insertion point to the end
      setCaretPosition(doc.getLength());
      // Insert the text
      replaceSelection(text);
      // Convert the new end location
      // to view co-ordinates
      Rectangle r = modelToView(doc.getLength());
      // Finally, scroll so that the new text is visible
      if (r != null) {
        scrollRectToVisible(r);
      }
    } catch (BadLocationException e) {
      System.out.println("Failed to append text: " + e);
    }
  }
  // Testing method
  public static void main(String[] args) {
    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    } catch (Exception evt) {}
  
    JFrame f = new JFrame("Text Pane with Scrolling Append");
    final AppendingTextPane atp = new AppendingTextPane();
    f.getContentPane().add(new JScrollPane(atp));
    f.setSize(200, 200);
    f.setVisible(true);
    // Add some text every second
    Timer t = new Timer(1000, new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        String timeString = fmt.format(new Date());
        atp.appendText(timeString + "\n");
      }
      SimpleDateFormat fmt = new SimpleDateFormat("HH:mm:ss");
    });
    t.start();
  }
}