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",
			"<ul><li> </li></ul>", HTML.Tag.P, HTML.Tag.UL);
	private HTMLEditorKit.InsertHTMLTextAction bulletAction = new HTMLEditorKit.InsertHTMLTextAction("Bullets",
			"<li> </li>", 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: support@quantumhyperspace.com\n"
				+ "                     or \n" + "email: charles@quantumhyperspace.com\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
		 * <code>undo</code>, 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());

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值