JEditorPane/JTextPane常见操作(字体,颜色,字号,加粗,斜线,下划线,保存,行间距 等操作)以及HTML空格处理

下面是一个应用的例子源码:HTMLDocumentEditor

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
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.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.UIManager;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultEditorKit;
import javax.swing.text.Document;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledEditorKit;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoManager;

public class HTMLDocumentEditor extends JFrame implements ActionListener
{

	private HTMLDocument document;
	private JTextPane textPane = new JTextPane();
	private boolean debug = false;
	private File currentFile;

	/** Listener for the edits on the current document. */
	protected UndoableEditListener undoHandler = new UndoHandler();

	/** UndoManager that we add edits to. */
	protected UndoManager undo = new UndoManager();

	private UndoAction undoAction = new UndoAction();
	private RedoAction redoAction = new RedoAction();

	private Action cutAction = new DefaultEditorKit.CutAction();
	private Action copyAction = new DefaultEditorKit.CopyAction();
	private Action pasteAction = new DefaultEditorKit.PasteAction();

	private Action boldAction = new StyledEditorKit.BoldAction();
	private Action underlineAction = new StyledEditorKit.UnderlineAction();
	private Action italicAction = new StyledEditorKit.ItalicAction();

	private Action insertBreakAction = new DefaultEditorKit.InsertBreakAction();
	private HTMLEditorKit.InsertHTMLTextAction unorderedListAction = new HTMLEditorKit.InsertHTMLTextAction("Bullets",
			"
", HTML.Tag.P, HTML.Tag.UL); private HTMLEditorKit.InsertHTMLTextAction bulletAction = new HTMLEditorKit.InsertHTMLTextAction("Bullets", "
  • ", HTML.Tag.UL, HTML.Tag.LI); public HTMLDocumentEditor() { super("HTMLDocumentEditor"); HTMLEditorKit editorKit = new HTMLEditorKit(); document = (HTMLDocument) editorKit.createDefaultDocument(); // Force SwingSet to come up in the Cross Platform L&F try { // UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); // If you want the System L&F instead, comment out the above line and // uncomment the following: UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception exc) { System.err.println("Error loading L&F: " + exc); } init(); } public static void main(String[] args) { HTMLDocumentEditor editor = new HTMLDocumentEditor(); } public void init() { addWindowListener(new FrameListener()); JMenuBar menuBar = new JMenuBar(); getContentPane().add(menuBar, BorderLayout.NORTH); JMenu fileMenu = new JMenu("File"); JMenu editMenu = new JMenu("Edit"); JMenu colorMenu = new JMenu("Color"); JMenu fontMenu = new JMenu("Font"); JMenu styleMenu = new JMenu("Style"); JMenu alignMenu = new JMenu("Align"); JMenu helpMenu = new JMenu("Help"); menuBar.add(fileMenu); menuBar.add(editMenu); menuBar.add(colorMenu); menuBar.add(fontMenu); menuBar.add(styleMenu); menuBar.add(alignMenu); menuBar.add(helpMenu); JMenuItem newItem = new JMenuItem("New", new ImageIcon("whatsnew-bang.gif")); JMenuItem openItem = new JMenuItem("Open", new ImageIcon("open.gif")); JMenuItem saveItem = new JMenuItem("Save", new ImageIcon("save.gif")); JMenuItem saveAsItem = new JMenuItem("Save As"); JMenuItem exitItem = new JMenuItem("Exit", new ImageIcon("exit.gif")); newItem.addActionListener(this); openItem.addActionListener(this); saveItem.addActionListener(this); saveAsItem.addActionListener(this); exitItem.addActionListener(this); fileMenu.add(newItem); fileMenu.add(openItem); fileMenu.add(saveItem); fileMenu.add(saveAsItem); fileMenu.add(exitItem); JMenuItem undoItem = new JMenuItem(undoAction); JMenuItem redoItem = new JMenuItem(redoAction); JMenuItem cutItem = new JMenuItem(cutAction); JMenuItem copyItem = new JMenuItem(copyAction); JMenuItem pasteItem = new JMenuItem(pasteAction); JMenuItem clearItem = new JMenuItem("Clear"); JMenuItem selectAllItem = new JMenuItem("Select All"); JMenuItem insertBreaKItem = new JMenuItem(insertBreakAction); JMenuItem unorderedListItem = new JMenuItem(unorderedListAction); JMenuItem bulletItem = new JMenuItem(bulletAction); cutItem.setText("Cut"); copyItem.setText("Copy"); pasteItem.setText("Paste"); insertBreaKItem.setText("Break"); cutItem.setIcon(new ImageIcon("cut.gif")); copyItem.setIcon(new ImageIcon("copy.gif")); pasteItem.setIcon(new ImageIcon("paste.gif")); insertBreaKItem.setIcon(new ImageIcon("break.gif")); unorderedListItem.setIcon(new ImageIcon("bullets.gif")); clearItem.addActionListener(this); selectAllItem.addActionListener(this); editMenu.add(undoItem); editMenu.add(redoItem); editMenu.add(cutItem); editMenu.add(copyItem); editMenu.add(pasteItem); editMenu.add(clearItem); editMenu.add(selectAllItem); editMenu.add(insertBreaKItem); editMenu.add(unorderedListItem); editMenu.add(bulletItem); JMenuItem redTextItem = new JMenuItem(new StyledEditorKit.ForegroundAction("Red", Color.red)); JMenuItem orangeTextItem = new JMenuItem(new StyledEditorKit.ForegroundAction("Orange", Color.orange)); JMenuItem yellowTextItem = new JMenuItem(new StyledEditorKit.ForegroundAction("Yellow", Color.yellow)); JMenuItem greenTextItem = new JMenuItem(new StyledEditorKit.ForegroundAction("Green", Color.green)); JMenuItem blueTextItem = new JMenuItem(new StyledEditorKit.ForegroundAction("Blue", Color.blue)); JMenuItem cyanTextItem = new JMenuItem(new StyledEditorKit.ForegroundAction("Cyan", Color.cyan)); JMenuItem magentaTextItem = new JMenuItem(new StyledEditorKit.ForegroundAction("Magenta", Color.magenta)); JMenuItem blackTextItem = new JMenuItem(new StyledEditorKit.ForegroundAction("Black", Color.black)); redTextItem.setIcon(new ImageIcon("red.gif")); orangeTextItem.setIcon(new ImageIcon("orange.gif")); yellowTextItem.setIcon(new ImageIcon("yellow.gif")); greenTextItem.setIcon(new ImageIcon("green.gif")); blueTextItem.setIcon(new ImageIcon("blue.gif")); cyanTextItem.setIcon(new ImageIcon("cyan.gif")); magentaTextItem.setIcon(new ImageIcon("magenta.gif")); blackTextItem.setIcon(new ImageIcon("black.gif")); colorMenu.add(redTextItem); colorMenu.add(orangeTextItem); colorMenu.add(yellowTextItem); colorMenu.add(greenTextItem); colorMenu.add(blueTextItem); colorMenu.add(cyanTextItem); colorMenu.add(magentaTextItem); colorMenu.add(blackTextItem); JMenu fontTypeMenu = new JMenu("Font Type"); fontMenu.add(fontTypeMenu); String[] fontTypes = { "SansSerif", "Serif", "Monospaced", "Dialog", "DialogInput" }; for(int i = 0; i < fontTypes.length; i++) { if(debug) System.out.println(fontTypes[i]); JMenuItem nextTypeItem = new JMenuItem(fontTypes[i]); nextTypeItem.setAction(new StyledEditorKit.FontFamilyAction(fontTypes[i], fontTypes[i])); fontTypeMenu.add(nextTypeItem); } JMenu fontSizeMenu = new JMenu("Font Size"); fontMenu.add(fontSizeMenu); int[] fontSizes = { 6, 8, 10, 12, 14, 16, 20, 24, 32, 36, 48, 72 }; for(int i = 0; i < fontSizes.length; i++) { if(debug) System.out.println(fontSizes[i]); JMenuItem nextSizeItem = new JMenuItem(String.valueOf(fontSizes[i])); nextSizeItem.setAction(new StyledEditorKit.FontSizeAction(String.valueOf(fontSizes[i]), fontSizes[i])); fontSizeMenu.add(nextSizeItem); } JMenuItem boldMenuItem = new JMenuItem(boldAction); JMenuItem underlineMenuItem = new JMenuItem(underlineAction); JMenuItem italicMenuItem = new JMenuItem(italicAction); boldMenuItem.setText("Bold"); underlineMenuItem.setText("Underline"); italicMenuItem.setText("Italic"); boldMenuItem.setIcon(new ImageIcon("bold.gif")); underlineMenuItem.setIcon(new ImageIcon("underline.gif")); italicMenuItem.setIcon(new ImageIcon("italic.gif")); styleMenu.add(boldMenuItem); styleMenu.add(underlineMenuItem); styleMenu.add(italicMenuItem); JMenuItem subscriptMenuItem = new JMenuItem(new SubscriptAction()); JMenuItem superscriptMenuItem = new JMenuItem(new SuperscriptAction()); JMenuItem strikeThroughMenuItem = new JMenuItem(new StrikeThroughAction()); subscriptMenuItem.setText("Subscript"); superscriptMenuItem.setText("Superscript"); strikeThroughMenuItem.setText("StrikeThrough"); subscriptMenuItem.setIcon(new ImageIcon("subscript.gif")); superscriptMenuItem.setIcon(new ImageIcon("superscript.gif")); strikeThroughMenuItem.setIcon(new ImageIcon("strikethough.gif")); styleMenu.add(subscriptMenuItem); styleMenu.add(superscriptMenuItem); styleMenu.add(strikeThroughMenuItem); JMenuItem leftAlignMenuItem = new JMenuItem(new StyledEditorKit.AlignmentAction("Left Align", StyleConstants.ALIGN_LEFT)); JMenuItem centerMenuItem = new JMenuItem(new StyledEditorKit.AlignmentAction("Center", StyleConstants.ALIGN_CENTER)); JMenuItem rightAlignMenuItem = new JMenuItem(new StyledEditorKit.AlignmentAction("Right Align", StyleConstants.ALIGN_RIGHT)); leftAlignMenuItem.setText("Left Align"); centerMenuItem.setText("Center"); rightAlignMenuItem.setText("Right Align"); leftAlignMenuItem.setIcon(new ImageIcon("left.gif")); centerMenuItem.setIcon(new ImageIcon("center.gif")); rightAlignMenuItem.setIcon(new ImageIcon("right.gif")); alignMenu.add(leftAlignMenuItem); alignMenu.add(centerMenuItem); alignMenu.add(rightAlignMenuItem); JMenuItem helpItem = new JMenuItem("Help"); helpItem.addActionListener(this); helpMenu.add(helpItem); JMenuItem shortcutsItem = new JMenuItem("Keyboard Shortcuts"); shortcutsItem.addActionListener(this); helpMenu.add(shortcutsItem); JMenuItem aboutItem = new JMenuItem("About QuantumHyperSpace"); aboutItem.addActionListener(this); helpMenu.add(aboutItem); JPanel editorControlPanel = new JPanel(); // editorControlPanel.setLayout(new GridLayout(3,3)); editorControlPanel.setLayout(new FlowLayout()); /* JButtons */ JButton cutButton = new JButton(cutAction); JButton copyButton = new JButton(copyAction); JButton pasteButton = new JButton(pasteAction); JButton boldButton = new JButton(boldAction); JButton underlineButton = new JButton(underlineAction); JButton italicButton = new JButton(italicAction); // JButton insertButton = new JButton(insertAction); // JButton insertBreakButton = new JButton(insertBreakAction); // JButton tabButton = new JButton(tabAction); cutButton.setText("Cut"); copyButton.setText("Copy"); pasteButton.setText("Paste"); boldButton.setText("Bold"); underlineButton.setText("Underline"); italicButton.setText("Italic"); // insertButton.setText("Insert"); // insertBreakButton.setText("Insert Break"); // tabButton.setText("Tab"); cutButton.setIcon(new ImageIcon("cut.gif")); copyButton.setIcon(new ImageIcon("copy.gif")); pasteButton.setIcon(new ImageIcon("paste.gif")); boldButton.setIcon(new ImageIcon("bold.gif")); underlineButton.setIcon(new ImageIcon("underline.gif")); italicButton.setIcon(new ImageIcon("italic.gif")); editorControlPanel.add(cutButton); editorControlPanel.add(copyButton); editorControlPanel.add(pasteButton); editorControlPanel.add(boldButton); editorControlPanel.add(underlineButton); editorControlPanel.add(italicButton); // editorControlPanel.add(insertButton); // editorControlPanel.add(insertBreakButton); // editorControlPanel.add(tabButton); JButton subscriptButton = new JButton(new SubscriptAction()); JButton superscriptButton = new JButton(new SuperscriptAction()); JButton strikeThroughButton = new JButton(new StrikeThroughAction()); subscriptButton.setIcon(new ImageIcon("subscript.gif")); superscriptButton.setIcon(new ImageIcon("superscript.gif")); strikeThroughButton.setIcon(new ImageIcon("strikethough.gif")); JPanel specialPanel = new JPanel(); specialPanel.setLayout(new FlowLayout()); specialPanel.add(subscriptButton); specialPanel.add(superscriptButton); specialPanel.add(strikeThroughButton); // JButton leftAlignButton = new JButton(new AlignLeftAction()); // JButton centerButton = new JButton(new CenterAction()); // JButton rightAlignButton = new JButton(new AlignRightAction()); JButton leftAlignButton = new JButton(new StyledEditorKit.AlignmentAction("Left Align", StyleConstants.ALIGN_LEFT)); JButton centerButton = new JButton(new StyledEditorKit.AlignmentAction("Center", StyleConstants.ALIGN_CENTER)); JButton rightAlignButton = new JButton(new StyledEditorKit.AlignmentAction("Right Align", StyleConstants.ALIGN_RIGHT)); JButton colorButton = new JButton(new StyledEditorKit.AlignmentAction("Right Align", StyleConstants.ALIGN_RIGHT)); leftAlignButton.setIcon(new ImageIcon("left.gif")); centerButton.setIcon(new ImageIcon("center.gif")); rightAlignButton.setIcon(new ImageIcon("right.gif")); colorButton.setIcon(new ImageIcon("color.gif")); leftAlignButton.setText("Left Align"); centerButton.setText("Center"); rightAlignButton.setText("Right Align"); JPanel alignPanel = new JPanel(); alignPanel.setLayout(new FlowLayout()); alignPanel.add(leftAlignButton); alignPanel.add(centerButton); alignPanel.add(rightAlignButton); document.addUndoableEditListener(undoHandler); resetUndoManager(); textPane = new JTextPane(document); textPane.setContentType("text/html"); JScrollPane scrollPane = new JScrollPane(textPane); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension scrollPaneSize = new Dimension(5 * screenSize.width / 8, 5 * screenSize.height / 8); scrollPane.setPreferredSize(scrollPaneSize); JPanel toolPanel = new JPanel(); toolPanel.setLayout(new BorderLayout()); toolPanel.add(editorControlPanel, BorderLayout.NORTH); toolPanel.add(specialPanel, BorderLayout.CENTER); toolPanel.add(alignPanel, BorderLayout.SOUTH); getContentPane().add(menuBar, BorderLayout.NORTH); // getContentPane().add(toolPanel, BorderLayout.CENTER); getContentPane().add(scrollPane, BorderLayout.SOUTH); pack(); setLocationRelativeTo(null); startNewDocument(); show(); } public void actionPerformed(ActionEvent ae) { String actionCommand = ae.getActionCommand(); if(debug) { int modifier = ae.getModifiers(); long when = ae.getWhen(); String parameter = ae.paramString(); System.out.println("actionCommand: " + actionCommand); System.out.println("modifier: " + modifier); System.out.println("when: " + when); System.out.println("parameter: " + parameter); } if(actionCommand.compareTo("New") == 0) { startNewDocument(); } else if(actionCommand.compareTo("Open") == 0) { openDocument(); } else if(actionCommand.compareTo("Save") == 0) { saveDocument(); } else if(actionCommand.compareTo("Save As") == 0) { saveDocumentAs(); } else if(actionCommand.compareTo("Exit") == 0) { exit(); } else if(actionCommand.compareTo("Clear") == 0) { clear(); } else if(actionCommand.compareTo("Select All") == 0) { selectAll(); } else if(actionCommand.compareTo("Help") == 0) { help(); } else if(actionCommand.compareTo("Keyboard Shortcuts") == 0) { showShortcuts(); } else if(actionCommand.compareTo("About QuantumHyperSpace") == 0) { aboutQuantumHyperSpace(); } } protected void resetUndoManager() { undo.discardAllEdits(); undoAction.update(); redoAction.update(); } public void startNewDocument() { Document oldDoc = textPane.getDocument(); if(oldDoc != null) oldDoc.removeUndoableEditListener(undoHandler); HTMLEditorKit editorKit = new HTMLEditorKit(); document = (HTMLDocument) editorKit.createDefaultDocument(); textPane.setDocument(document); currentFile = null; setTitle("HTMLDocumentEditor"); textPane.getDocument().addUndoableEditListener(undoHandler); resetUndoManager(); } public void openDocument() { try { File current = new File("."); JFileChooser chooser = new JFileChooser(current); chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); chooser.setFileFilter(new HTMLFileFilter()); int approval = chooser.showSaveDialog(this); if(approval == JFileChooser.APPROVE_OPTION) { currentFile = chooser.getSelectedFile(); setTitle(currentFile.getName()); FileReader fr = new FileReader(currentFile); Document oldDoc = textPane.getDocument(); if(oldDoc != null) oldDoc.removeUndoableEditListener(undoHandler); HTMLEditorKit editorKit = new HTMLEditorKit(); document = (HTMLDocument) editorKit.createDefaultDocument(); editorKit.read(fr, document, 0); document.addUndoableEditListener(undoHandler); textPane.setDocument(document); resetUndoManager(); } } catch(BadLocationException ble) { System.err.println("BadLocationException: " + ble.getMessage()); } catch(FileNotFoundException fnfe) { System.err.println("FileNotFoundException: " + fnfe.getMessage()); } catch(IOException ioe) { System.err.println("IOException: " + ioe.getMessage()); } } public void saveDocument() { if(currentFile != null) { try { JOptionPane.showMessageDialog(null, textPane.getText()); FileWriter fw = new FileWriter(currentFile); fw.write(textPane.getText()); fw.close(); } catch(FileNotFoundException fnfe) { System.err.println("FileNotFoundException: " + fnfe.getMessage()); } catch(IOException ioe) { System.err.println("IOException: " + ioe.getMessage()); } } else { saveDocumentAs(); } } public void saveDocumentAs() { try { JOptionPane.showMessageDialog(null, textPane.getText()); File current = new File("."); JFileChooser chooser = new JFileChooser(current); chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); chooser.setFileFilter(new HTMLFileFilter()); int approval = chooser.showSaveDialog(this); if(approval == JFileChooser.APPROVE_OPTION) { File newFile = chooser.getSelectedFile(); if(newFile.exists()) { String message = newFile.getAbsolutePath() + " already exists. \n" + "Do you want to replace it?"; if(JOptionPane.showConfirmDialog(this, message) == JOptionPane.YES_OPTION) { currentFile = newFile; setTitle(currentFile.getName()); FileWriter fw = new FileWriter(currentFile); fw.write(textPane.getText()); fw.close(); if(debug) System.out.println("Saved " + currentFile.getAbsolutePath()); } } else { currentFile = new File(newFile.getAbsolutePath()); setTitle(currentFile.getName()); FileWriter fw = new FileWriter(currentFile); fw.write(textPane.getText()); fw.close(); if(debug) System.out.println("Saved " + currentFile.getAbsolutePath()); } } } catch(FileNotFoundException fnfe) { System.err.println("FileNotFoundException: " + fnfe.getMessage()); } catch(IOException ioe) { System.err.println("IOException: " + ioe.getMessage()); } } public void exit() { String exitMessage = "Are you sure you want to exit?"; if(JOptionPane.showConfirmDialog(this, exitMessage) == JOptionPane.YES_OPTION) { System.exit(0); } } public void clear() { startNewDocument(); } public void selectAll() { textPane.selectAll(); } public void help() { JOptionPane.showMessageDialog(this, "DocumentEditor.java\n" + "Author: Charles Bell\n" + "Version: May 25, 2002\n" + "http://www.quantumhyperspace.com\n" + "QuantumHyperSpace Programming Services"); } public void showShortcuts() { String shortcuts = "Navigate in | Tab\n" + "Navigate out | Ctrl+Tab\n" + "Navigate out backwards | Shift+Ctrl+Tab\n" + "Move up/down a line | Up/Down Arrown\n" + "Move left/right a component or char | Left/Right Arrow\n" + "Move up/down one vertical block | PgUp/PgDn\n" + "Move to start/end of line | Home/End\n" + "Move to previous/next word | Ctrl+Left/Right Arrow\n" + "Move to start/end of data | Ctrl+Home/End\n" + "Move left/right one block | Ctrl+PgUp/PgDn\n" + "Select All | Ctrl+A\n" + "Extend selection up one line | Shift+Up Arrow\n" + "Extend selection down one line | Shift+Down Arrow\n" + "Extend selection to beginning of line | Shift+Home\n" + "Extend selection to end of line | Shift+End\n" + "Extend selection to beginning of data | Ctrl+Shift+Home\n" + "Extend selection to end of data | Ctrl+Shift+End\n" + "Extend selection left | Shift+Right Arrow\n" + "Extend selection right | Shift+Right Arrow\n" + "Extend selection up one vertical block | Shift+PgUp\n" + "Extend selection down one vertical block | Shift+PgDn\n" + "Extend selection left one block | Ctrl+Shift+PgUp\n" + "Extend selection right one block | Ctrl+Shift+PgDn\n" + "Extend selection left one word | Ctrl+Shift+Left Arrow\n" + "Extend selection right one word | Ctrl+Shift+Right Arrow\n"; JOptionPane.showMessageDialog(this, shortcuts); } public void aboutQuantumHyperSpace() { JOptionPane.showMessageDialog(this, "QuantumHyperSpace Programming Services\n" + "http://www.quantumhyperspace.com\n" + "email: [email protected]\n" + " or \n" + "email: [email protected]\n", "QuantumHyperSpace", JOptionPane.INFORMATION_MESSAGE, new ImageIcon("quantumhyperspace.gif")); } class FrameListener extends WindowAdapter { public void windowClosing(WindowEvent we) { exit(); } } class SubscriptAction extends StyledEditorKit.StyledTextAction { public SubscriptAction() { super(StyleConstants.Subscript.toString()); } public void actionPerformed(ActionEvent ae) { JEditorPane editor = getEditor(ae); if(editor != null) { StyledEditorKit kit = getStyledEditorKit(editor); MutableAttributeSet attr = kit.getInputAttributes(); boolean subscript = (StyleConstants.isSubscript(attr)) ? false : true; SimpleAttributeSet sas = new SimpleAttributeSet(); StyleConstants.setSubscript(sas, subscript); setCharacterAttributes(editor, sas, false); } } } class SuperscriptAction extends StyledEditorKit.StyledTextAction { public SuperscriptAction() { super(StyleConstants.Superscript.toString()); } public void actionPerformed(ActionEvent ae) { JEditorPane editor = getEditor(ae); if(editor != null) { StyledEditorKit kit = getStyledEditorKit(editor); MutableAttributeSet attr = kit.getInputAttributes(); boolean superscript = (StyleConstants.isSuperscript(attr)) ? false : true; SimpleAttributeSet sas = new SimpleAttributeSet(); StyleConstants.setSuperscript(sas, superscript); setCharacterAttributes(editor, sas, false); } } } class StrikeThroughAction extends StyledEditorKit.StyledTextAction { public StrikeThroughAction() { super(StyleConstants.StrikeThrough.toString()); } public void actionPerformed(ActionEvent ae) { JEditorPane editor = getEditor(ae); if(editor != null) { StyledEditorKit kit = getStyledEditorKit(editor); MutableAttributeSet attr = kit.getInputAttributes(); boolean strikeThrough = (StyleConstants.isStrikeThrough(attr)) ? false : true; SimpleAttributeSet sas = new SimpleAttributeSet(); StyleConstants.setStrikeThrough(sas, strikeThrough); setCharacterAttributes(editor, sas, false); } } } class HTMLFileFilter extends javax.swing.filechooser.FileFilter { public boolean accept(File f) { return((f.isDirectory()) || (f.getName().toLowerCase().indexOf(".htm") > 0)); } public String getDescription() { return "html"; } } class UndoHandler implements UndoableEditListener { /** * Messaged when the Document has created an edit, the edit is added to * undo, an instance of UndoManager. */ public void undoableEditHappened(UndoableEditEvent e) { undo.addEdit(e.getEdit()); undoAction.update(); redoAction.update(); } } class UndoAction extends AbstractAction { public UndoAction() { super("Undo"); setEnabled(false); } public void actionPerformed(ActionEvent e) { try { undo.undo(); } catch(CannotUndoException ex) { System.out.println("Unable to undo: " + ex); ex.printStackTrace(); } update(); redoAction.update(); } protected void update() { if(undo.canUndo()) { setEnabled(true); putValue(Action.NAME, undo.getUndoPresentationName()); } else { setEnabled(false); putValue(Action.NAME, "Undo"); } } } class RedoAction extends AbstractAction { public RedoAction() { super("Redo"); setEnabled(false); } public void actionPerformed(ActionEvent e) { try { undo.redo(); } catch(CannotRedoException ex) { System.err.println("Unable to redo: " + ex); ex.printStackTrace(); } update(); undoAction.update(); } protected void update() { if(undo.canRedo()) { setEnabled(true); putValue(Action.NAME, undo.getRedoPresentationName()); } else { setEnabled(false); putValue(Action.NAME, "Redo"); } } } }


     

     

    使用HTML的文档格式:

    HTMLEditorKit editorKit = new HTMLEditorKit();
    HTMLDocument  document = (HTMLDocument) editorKit.createDefaultDocument();

    textPane = new JTextPane(document);
    textPane.setContentType("text/html");

     

    JEditorPane已经提供了字体,颜色,字号,加粗等基本操作的Action

    Action[] actions = TextAction.augmentList(editorPane.getActions(), defaultActions);

    commands = new Hashtable();

    for(int i = 0; i < actions.length; i++)
     {
    Action a = actions[i];
    commands.put(a.getValue(Action.NAME), a);
    }

     

    //函数,返回Action

        protected Action getAction(String cmd)
        {
            return (Action) commands.get(cmd);
        }

     

    Action boldAction = this.getAction("font-bold");

     

    Action copyAction = this.getAction("copy-to-clipboard");
    Action cutAction = this.getAction("cut-to-clipboard");
    Action pasteAction = this.getAction("paste-from-clipboard");
    Action boldAction = this.getAction("font-bold");
    Action italicAction = this.getAction("font-italic");
    Action underlineAction = this.getAction("font-underline");
    Action leftAction = this.getAction("left-justify");
    Action centerAction = this.getAction("center-justify");
    Action rightAction = this.getAction("right-justify");

     

    //颜色:

    ActionListener colorActionListener = new StyledEditorKit.ForegroundAction("set-foreground-", color);
    colorActionListener.actionPerformed(new ActionEvent(editorPane, 0, ""));

     

    //行间距:

    if(editorPane instanceof JTextPane)
    {
     StyledDocument doc = ((JTextPane) editorPane).getStyledDocument();
     MutableAttributeSet attr = new SimpleAttributeSet();
     StyleConstants.setLineSpacing(attr, (float) DoubleUtil.getAsDouble(t));
     doc.setParagraphAttributes(editorPane.getSelectionStart(), editorPane.getSelectionEnd(), attr, false);

    }

     

    //插入图片(针对JTextPane):

    ((JTextPane)editorPane).insertIcon(new ImageIcon(file.getPath()));

     

    //保存(随机一个文件名):

    BufferedInputStream d = (BufferedInputStream) this.getPage().getContent();
            byte[] c = new byte[d.available()];
            d.read(c);
            HTMLDocument doc = (HTMLDocument) this.getDocument();
            Random rand = new Random();
            int t = rand.nextInt();
            File f = new File("m" + t + ".html");
            FileOutputStream fstrm = new FileOutputStream(f);
            ObjectOutput ostrm = new ObjectOutputStream(fstrm);
            ostrm.writeObject(this.getDocument());
            ostrm.flush();

       jtextpanel

                  FileOutputStream fstrm = new FileOutputStream(file);
                ObjectOutput ostrm = new ObjectOutputStream(fstrm);
                ostrm.writeObject(this.getDocument());
               
               
                Log.info(this.getDocument().getText(0, this.getDocument().getLength()));
               
               
                ostrm.flush();

     

     

     

    //打开JEditorPane

    this.setPage("file:///" + f.getAbsolutePath());

    JTextPanel

    File f = new File("temptextpanelfile");
                FileInputStream fin = new FileInputStream(f);
                ObjectInputStream istrm = new ObjectInputStream(fin);
                Document doc = (Document) istrm.readObject();
                if(this.getDocument() != null)
                    this.getDocument().removeUndoableEditListener(toolbar.undoHandler);
                this.setDocument(doc);
                doc.addUndoableEditListener(toolbar.undoHandler);
                resetUndoManager();
                validate();
                istrm.close();
                fin.close();
               
                f.delete();

     

     

     

    一般来说使用JEditorPane时使用setPage(url)来显示,储存时存为文件。

    在我的应用中,我不想存为文件,我想得到完整的HTML格式的字符。所以我使用getText()(不要用document来返回)来返回字符,用setText来显示,基本上差不多,但有个问题就是用getText返回时会自动去掉你输入的空格。搞死人,Google上猛搜索了一下后得到如下解决方法:

    //新建一个DocumentFilter

    public class CustDocumentFilter extends DocumentFilter
    {
        static String space = " ";
        static String spaceSeq = "\240";
        static String tab = "\t";
        static String tabSeq = "\240\240\240\240";

        // important: always overwrite all three methods
        public void insertString(DocumentFilter.FilterBypass fb, int offset, String string, AttributeSet attr)
                throws BadLocationException
        {
            string = doFiltering(string);
            fb.insertString(offset, string, attr);
        }
        public void remove(DocumentFilter.FilterBypass fb, int offset, int length) throws BadLocationException
        {
            fb.remove(offset, length);
        }

        public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
                throws BadLocationException
        {
            text = doFiltering(text);
            fb.replace(offset, length, text, attrs);
        }
        private String doFiltering(String in)
        {
            String out = in.replaceAll(space, spaceSeq);
            return out.replaceAll(tab, tabSeq);
        }
    }

    然后使用

    ((HTMLDocument)this.getDocument()).setDocumentFilter(new CustDocumentFilter());

    这样就可以避免你输入的空格别吃掉了。

    你可能感兴趣的:(Swing)