您的位置:首页 > Web前端 > HTML

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

2013-02-18 17:09 1231 查看
下面是一个应用的例子源码: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());

这样就可以避免你输入的空格别吃掉了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐