JEditorPane实例13 : 文字编辑模板 « 图形用户界面 « Java

En
Java
1. 图形用户界面
2. 三维图形动画
3. 高级图形
4. 蚂蚁编译
5. Apache类库
6. 统计图
7. 
8. 集合数据结构
9. 数据类型
10. 数据库JDBC
11. 设计模式
12. 开发相关类
13. EJB3
14. 电子邮件
15. 事件
16. 文件输入输出
17. 游戏
18. 泛型
19. GWT
20. Hibernate
21. 本地化
22. J2EE平台
23. 基于J2ME
24. JDK-6
25. JNDI的LDAP
26. JPA
27. JSP技术
28. JSTL
29. 语言基础知识
30. 网络协议
31. PDF格式RTF格式
32. 映射
33. 常规表达式
34. 脚本
35. 安全
36. Servlets
37. Spring
38. Swing组件
39. 图形用户界面
40. SWT-JFace-Eclipse
41. 线程
42. 应用程序
43. Velocity
44. Web服务SOA
45. 可扩展标记语言
Java 教程
Java » 图形用户界面 » 文字编辑模板屏幕截图 
JEditorPane实例13
JEditorPane实例13
  
/*
Core SWING Advanced Programming 
By Kim Topley
ISBN: 0 13 083292 8       
Publisher: Prentice Hall  
*/


import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.ChangedCharSetException;
import javax.swing.text.Document;
import javax.swing.text.Element;
import javax.swing.text.ElementIterator;
import javax.swing.text.StyleConstants;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.HTMLFrameHyperlinkEvent;
import javax.swing.text.html.StyleSheet;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

public class EditorPaneExample13 extends JFrame {
  public EditorPaneExample13() {
    super("JEditorPane Example 13");

    pane = new JEditorPane();
    pane.setEditable(false)// Read-only
    getContentPane().add(new JScrollPane(pane)"Center");

    // Build the panel of controls
    JPanel panel = new JPanel();

    panel.setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    c.gridwidth = 1;
    c.gridheight = 1;
    c.anchor = GridBagConstraints.EAST;
    c.fill = GridBagConstraints.NONE;
    c.weightx = 0.0;
    c.weighty = 0.0;

    JLabel urlLabel = new JLabel("URL: ", JLabel.RIGHT);
    panel.add(urlLabel, c);
    JLabel loadingLabel = new JLabel("State: ", JLabel.RIGHT);
    c.gridy = 1;
    panel.add(loadingLabel, c);
    JLabel typeLabel = new JLabel("Type: ", JLabel.RIGHT);
    c.gridy = 2;
    panel.add(typeLabel, c);
    c.gridy = 3;
    panel.add(new JLabel(LOAD_TIME), c);

    c.gridy = 4;
    c.gridwidth = 2;
    c.weightx = 1.0;
    c.anchor = GridBagConstraints.WEST;
    onlineLoad = new JCheckBox("Online Load");
    panel.add(onlineLoad, c);
    onlineLoad.setSelected(true);
    onlineLoad.setForeground(typeLabel.getForeground());

    c.gridx = 1;
    c.gridy = 0;
    c.anchor = GridBagConstraints.EAST;
    c.fill = GridBagConstraints.HORIZONTAL;

    urlCombo = new JComboBox();
    panel.add(urlCombo, c);
    urlCombo.setEditable(true);
    loadingState = new JLabel(spaces, JLabel.LEFT);
    loadingState.setForeground(Color.black);
    c.gridy = 1;
    panel.add(loadingState, c);
    loadedType = new JLabel(spaces, JLabel.LEFT);
    loadedType.setForeground(Color.black);
    c.gridy = 2;
    panel.add(loadedType, c);
    timeLabel = new JLabel("");
    c.gridy = 3;
    panel.add(timeLabel, c);

    getContentPane().add(panel, "South");

    // Load a new default style sheet
    InputStream is = EditorPaneExample13.class
        .getResourceAsStream("changedDefault.css");
    if (is != null) {
      try {
        StyleSheet ss = loadStyleSheet(is);
        editorKit.setStyleSheet(ss);
      catch (IOException e) {
        System.out.println("Failed to load new default style sheet");
      }
    }

    // Allocate the empty tree model
    DefaultMutableTreeNode emptyRootNode = new DefaultMutableTreeNode(
        "Empty");
    emptyModel = new DefaultTreeModel(emptyRootNode);

    // Create and place the heading tree
    tree = new JTree(emptyModel);
    tree.setPreferredSize(new Dimension(200200));
    getContentPane().add(new JScrollPane(tree)"East");

    // Change page based on combo selection
    urlCombo.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        if (populatingCombo == true) {
          return;
        }
        Object selection = urlCombo.getSelectedItem();
        loadNewPage(selection);
      }
    });

    // Listen for page load to complete
    pane.addPropertyChangeListener(new PropertyChangeListener() {
      public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getPropertyName().equals("page")) {
          loadComplete();
          displayLoadTime();
          populateCombo(findLinks(pane.getDocument()null));
          TreeNode node = buildHeadingTree(pane.getDocument());
          tree.setModel(new DefaultTreeModel(node));
          enableInput();
          loadingPage = false;
        }
      }
    });

    // Listener for tree selection
    tree.addTreeSelectionListener(new TreeSelectionListener() {
      public void valueChanged(TreeSelectionEvent evt) {
        TreePath path = evt.getNewLeadSelectionPath();
        if (path != null) {
          DefaultMutableTreeNode node = (DefaultMutableTreeNodepath
              .getLastPathComponent();
          Object userObject = node.getUserObject();
          if (userObject instanceof Heading) {
            Heading heading = (HeadinguserObject;
            try {
              Rectangle textRect = pane.modelToView(heading
                  .getOffset());
              textRect.y += * textRect.height;
              pane.scrollRectToVisible(textRect);
            catch (BadLocationException e) {
            }
          }
        }
      }
    });

    // Listener for hypertext events
    pane.addHyperlinkListener(new HyperlinkListener() {
      public void hyperlinkUpdate(HyperlinkEvent evt) {
        // Ignore hyperlink events if the frame is busy
        if (loadingPage == true) {
          return;
        }
        if (evt.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
          JEditorPane sp = (JEditorPaneevt.getSource();
          if (evt instanceof HTMLFrameHyperlinkEvent) {
            HTMLDocument doc = (HTMLDocumentsp.getDocument();
            doc
                .processHTMLFrameHyperlinkEvent((HTMLFrameHyperlinkEventevt);
          else {
            loadNewPage(evt.getURL());
          }
        else if (evt.getEventType() == HyperlinkEvent.EventType.ENTERED) {
          pane.setCursor(handCursor);
        else if (evt.getEventType() == HyperlinkEvent.EventType.EXITED) {
          pane.setCursor(defaultCursor);
        }
      }
    });
  }

  public void loadNewPage(Object page) {
    try {
      loadingPage = true;

      // Check if the new page and the old
      // page are the same.
      URL url;
      if (page instanceof URL) {
        url = (URLpage;
      else {
        url = new URL((Stringpage);
      }

      urlCombo.setSelectedItem(page);

      URL loadedURL = pane.getPage();
      if (loadedURL != null && loadedURL.sameFile(url)) {
        return;
      }

      // Try to display the page
      urlCombo.setEnabled(false)// Disable input
      urlCombo.paintImmediately(00, urlCombo.getSize().width, urlCombo
          .getSize().height);
      setCursor(waitCursor)// Busy cursor
      loadingState.setText("Loading...");
      loadingState.paintImmediately(00, loadingState.getSize().width,
          loadingState.getSize().height);
      loadedType.setText("");
      loadedType.paintImmediately(00, loadedType.getSize().width,
          loadedType.getSize().height);

      timeLabel.setText("");
      timeLabel.paintImmediately(00, timeLabel.getSize().width,
          timeLabel.getSize().height);

      // Display an empty tree while loading
      tree.setModel(emptyModel);
      tree.paintImmediately(00, tree.getSize().width,
          tree.getSize().height);

      startTime = System.currentTimeMillis();

      // Choose the loading method
      if (onlineLoad.isSelected()) {
        // Usual load via setPage
        pane.setPage(url);
        loadedType.setText(pane.getContentType());
      else {
        pane.setContentType("text/html");
        loadedType.setText(pane.getContentType());
        if (loader == null) {
          loader = new HTMLDocumentLoader();
        }
        HTMLDocument doc = loader.loadDocument(url);
        loadComplete();
        pane.setDocument(doc);
        displayLoadTime();
        populateCombo(findLinks(doc, null));
        TreeNode node = buildHeadingTree(doc);
        tree.setModel(new DefaultTreeModel(node));
        enableInput();
        loadingPage = false;
      }
    catch (Exception e) {
      System.out.println(e);
      JOptionPane.showMessageDialog(pane, new String[] {
          "Unable to open file", page.toString() },
          "File Open Error", JOptionPane.ERROR_MESSAGE);
      loadingState.setText("Failed");
      enableInput();
      loadingPage = false;
    }
  }

  public void loadComplete() {
    loadingState.setText("Page loaded.");
  }

  public void enableInput() {
    urlCombo.setEnabled(true)// Allow entry of new URL
    setCursor(defaultCursor);
    pane.setCursor(defaultCursor);
  }

  public void displayLoadTime() {
    double loadingTime = ((double) (System.currentTimeMillis() - startTime)) 1000d;
    timeLabel.setText(loadingTime + " seconds");
  }

  public void populateCombo(URL[] urls) {
    // Save existing selection
    Object o = urlCombo.getSelectedItem();
    populatingCombo = true;
    urlCombo.setModel(new DefaultComboBoxModel(urls));
    // Restore original selection
    urlCombo.setSelectedItem(o);
    populatingCombo = false;
  }

  public StyleSheet loadStyleSheet(InputStream isthrows IOException {
    StyleSheet s = new StyleSheet();
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    s.loadRules(reader, null);
    reader.close();

    return s;
  }

  public URL[] findLinks(Document doc, String protocol) {
    Vector links = new Vector();
    Vector urlNames = new Vector();
    URL baseURL = (URLdoc.getProperty(Document.StreamDescriptionProperty);

    if (doc instanceof HTMLDocument) {
      Element elem = doc.getDefaultRootElement();
      ElementIterator iterator = new ElementIterator(elem);

      while ((elem = iterator.next()) != null) {
        AttributeSet attrs = elem.getAttributes();
        Object link = attrs.getAttribute(HTML.Tag.A);
        if (link instanceof AttributeSet) {
          Object linkAttr = ((AttributeSetlink)
              .getAttribute(HTML.Attribute.HREF);
          if (linkAttr instanceof String) {
            try {
              URL linkURL = new URL(baseURL, (StringlinkAttr);
              if (protocol == null
                  || protocol.equalsIgnoreCase(linkURL
                      .getProtocol())) {
                String linkURLName = linkURL.toString();
                if (urlNames.contains(linkURLName== false) {
                  urlNames.addElement(linkURLName);
                  links.addElement(linkURL);
                }
              }
            catch (MalformedURLException e) {
              // Ignore invalid links
            }
          }
        }
      }
    }

    URL[] urls = new URL[links.size()];
    links.copyInto(urls);
    links.removeAllElements();
    urlNames.removeAllElements();

    return urls;
  }

  public TreeNode buildHeadingTree(Document doc) {
    String title = (Stringdoc.getProperty(Document.TitleProperty);
    if (title == null) {
      title = "[No title]";
    }
    Heading rootHeading = new Heading(title, 00);
    DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(
        rootHeading);

    DefaultMutableTreeNode lastNode[] new DefaultMutableTreeNode[7];
    int lastLevel = 0;
    lastNode[lastLevel= rootNode;

    if (doc instanceof HTMLDocument) {
      Element elem = doc.getDefaultRootElement();
      ElementIterator iterator = new ElementIterator(elem);
      Heading heading;

      while ((heading = getNextHeading(doc, iterator)) != null) {
        // Add the node to the tree
        DefaultMutableTreeNode hNode = new DefaultMutableTreeNode(
            heading);
        int level = heading.getLevel();

        if (level > lastLevel) {
          for (int i = lastLevel + 1; i < level; i++) {
            lastNode[inull;
          }
          lastNode[lastLevel].add(hNode);
        else {
          int prevLevel = level - 1;
          while (prevLevel >= 0) {
            if (lastNode[prevLevel!= null) {
              break;
            }
            lastNode[prevLevelnull;
            prevLevel--;
          }
          lastNode[prevLevel].add(hNode);
        }
        lastNode[level= hNode;
        lastLevel = level;
      }
    }
    return rootNode;
  }

  public Heading getNextHeading(Document doc, ElementIterator iter) {
    Element elem;

    while ((elem = iter.next()) != null) {
      AttributeSet attrs = elem.getAttributes();
      Object type = attrs.getAttribute(StyleConstants.NameAttribute);
      int level = getHeadingLevel(type);
      if (level > 0) {
        // It is a heading - get the text
        String headingText = "";
        int count = elem.getElementCount();
        for (int i = 0; i < count; i++) {
          Element child = elem.getElement(i);
          AttributeSet cattrs = child.getAttributes();
          if (cattrs.getAttribute(StyleConstants.NameAttribute== HTML.Tag.CONTENT) {
            try {
              int offset = child.getStartOffset();
              headingText += doc.getText(offset, child
                  .getEndOffset()
                  - offset);
            catch (BadLocationException e) {
            }
          }
        }
        headingText = headingText.trim();
        return new Heading(headingText, level, elem.getStartOffset());
      }
    }
    return null;
  }

  public int getHeadingLevel(Object type) {
    if (type instanceof HTML.Tag) {
      if (type == HTML.Tag.H1) {
        return 1;
      }
      if (type == HTML.Tag.H2) {
        return 2;
      }
      if (type == HTML.Tag.H3) {
        return 3;
      }
      if (type == HTML.Tag.H4) {
        return 4;
      }
      if (type == HTML.Tag.H5) {
        return 5;
      }
      if (type == HTML.Tag.H6) {
        return 6;
      }
    }

    return -1;
  }

  static class Heading {
    public Heading(String text, int level, int offset) {
      this.text = text;
      this.level = level;
      this.offset = offset;
    }

    public String getText() {
      return text;
    }

    public int getOffset() {
      return offset;
    }

    public int getLevel() {
      return level;
    }

    public String toString() {
      return text;
    }

    protected String text;

    protected int level;

    protected int offset;
  }

  public static void main(String[] args) {
    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    catch (Exception evt) {}
  
    JFrame f = new EditorPaneExample13();

    f.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) {
        System.exit(0);
      }
    });
    f.setSize(500400);
    f.setVisible(true);
  }

  private static final String spaces = "                    ";

  private static final String LOAD_TIME = "Load time: ";

  private HTMLDocumentLoader loader;

  private JEditorPane pane;

  private JLabel loadingState;

  private JLabel loadedType;

  private JLabel timeLabel;

  private JComboBox urlCombo;

  private JCheckBox onlineLoad;

  private JTree tree;

  private TreeModel emptyModel;

  private long startTime;

  private boolean populatingCombo;

  private boolean loadingPage;

  private static final Cursor waitCursor = Cursor
      .getPredefinedCursor(Cursor.WAIT_CURSOR);

  private static final Cursor defaultCursor = Cursor
      .getPredefinedCursor(Cursor.DEFAULT_CURSOR);

  private static final Cursor handCursor = Cursor
      .getPredefinedCursor(Cursor.HAND_CURSOR);

  private static final HTMLEditorKit editorKit = new HTMLEditorKit();
}

class HTMLDocumentLoader {
  public HTMLDocument loadDocument(HTMLDocument doc, URL url, String charSet)
      throws IOException {
    doc.putProperty(Document.StreamDescriptionProperty, url);

    /*
     * This loop allows the document read to be retried if the character
     * encoding changes during processing.
     */
    InputStream in = null;
    boolean ignoreCharSet = false;

    for (;;) {
      try {
        // Remove any document content
        doc.remove(0, doc.getLength());

        URLConnection urlc = url.openConnection();
        in = urlc.getInputStream();
        Reader reader = (charSet == nullnew InputStreamReader(in)
            new InputStreamReader(in, charSet);

        HTMLEditorKit.Parser parser = getParser();
        HTMLEditorKit.ParserCallback htmlReader = getParserCallback(doc);
        parser.parse(reader, htmlReader, ignoreCharSet);
        htmlReader.flush();

        // All done
        break;
      catch (BadLocationException ex) {
        // Should not happen - throw an IOException
        throw new IOException(ex.getMessage());
      catch (ChangedCharSetException e) {
        // The character set has changed - restart
        charSet = getNewCharSet(e);

        // Prevent recursion by suppressing further exceptions
        ignoreCharSet = true;

        // Close original input stream
        in.close();

        // Continue the loop to read with the correct encoding
      }
    }

    return doc;
  }

  public HTMLDocument loadDocument(URL url, String charSet)
      throws IOException {
    return loadDocument((HTMLDocumentkit.createDefaultDocument(), url,
        charSet);
  }

  public HTMLDocument loadDocument(URL urlthrows IOException {
    return loadDocument(url, null);
  }

  // Methods that allow customization of the parser and the callback
  public synchronized HTMLEditorKit.Parser getParser() {
    if (parser == null) {
      try {
        Class c = Class
            .forName("javax.swing.text.html.parser.ParserDelegator");
        parser = (HTMLEditorKit.Parserc.newInstance();
      catch (Throwable e) {
      }
    }
    return parser;
  }

  public synchronized HTMLEditorKit.ParserCallback getParserCallback(
      HTMLDocument doc) {
    return doc.getReader(0);
  }

  protected String getNewCharSet(ChangedCharSetException e) {
    String spec = e.getCharSetSpec();
    if (e.keyEqualsCharSet()) {
      // The event contains the new CharSet
      return spec;
    }

    // The event contains the content type
    // plus ";" plus qualifiers which may
    // contain a "charset" directive. First
    // remove the content type.
    int index = spec.indexOf(";");
    if (index != -1) {
      spec = spec.substring(index + 1);
    }

    // Force the string to lower case
    spec = spec.toLowerCase();

    StringTokenizer st = new StringTokenizer(spec, " \t="true);
    boolean foundCharSet = false;
    boolean foundEquals = false;
    while (st.hasMoreTokens()) {
      String token = st.nextToken();
      if (token.equals(" "|| token.equals("\t")) {
        continue;
      }
      if (foundCharSet == false && foundEquals == false
          && token.equals("charset")) {
        foundCharSet = true;
        continue;
      else if (foundEquals == false && token.equals("=")) {
        foundEquals = true;
        continue;
      else if (foundEquals == true && foundCharSet == true) {
        return token;
      }

      // Not recognized
      foundCharSet = false;
      foundEquals = false;
    }

    // No charset found - return a guess
    return "8859_1";
  }

  protected static HTMLEditorKit kit;

  protected static HTMLEditorKit.Parser parser;

  static {
    kit = new HTMLEditorKit();
  }
}

           
         
    
  
Related examples in the same category
1. 查看RTF格式查看RTF格式
2. EditorPane样本EditorPane样本
3. Setting the Font and Color of Text in a JTextPane Using Styles: Makes text red
4. Setting the Font and Color of Text in a JTextPane Using Styles: Inherits from "Red"; makes text red and underlined
5. Setting the Font and Color of Text in a JTextPane Using Styles: Makes text 24pts
6. Setting the Font and Color of Text in a JTextPane Using Styles: Makes text italicized
7. JEditorPane和HTML封装JEditorPane和HTML封装
8. JEditorPane和HTML包2JEditorPane和HTML包2
9. JEditorPane和HTML包3JEditorPane和HTML包3
10. JEditorPane和HTML包4JEditorPane和HTML包4
11. JEditorPane和HTML包5JEditorPane和HTML包5
12. JEditorPane和HTML包6JEditorPane和HTML包6
13. JEditorPane和HTML包装7JEditorPane和HTML包装7
14. JEditorPane和HTML包装8JEditorPane和HTML包装8
15. JEditorPane和HTML封装9JEditorPane和HTML封装9
16. EditorPane例如10EditorPane例如10
17. JEditorPane实例10 -使用getIteratorJEditorPane实例10 -使用getIterator
18. JEditorPane实例11JEditorPane实例11
19. JEditorPane实例12JEditorPane实例12
20. JEditorPane实例14JEditorPane实例14
21. JEditorPane实例15JEditorPane实例15
22. JEditorPane实例16JEditorPane实例16
23. JEditorPane实例17JEditorPane实例17
24. JEditorPane实例18JEditorPane实例18
25. JEditorPane实例19JEditorPane实例19
26. JEditorPane实例20JEditorPane实例20
27. JEditorPane和HyperlinkListener演示
28. Create a right-aligned tab stop at 200 pixels from the left margin
29. Create a center-aligned tab stop at 300 pixels from the left margin
30. Create a decimal-aligned tab stop at 400 pixels from the left margin
31. 使用SimpleAttributeSet与JTextPane
32. 查看HTML
33. 查看网页
34. Change mouse cursor during mouse-over action on hyperlinks
35. 创建一个简单的浏览器
36. 新增彩色文本
www.java2java.com | Contact Us
Copyright 2010 - 2030 Java Source and Support. All rights reserved.
All other trademarks are property of their respective owners.