Java tutorial
import java.awt.BorderLayout; import java.awt.Color; import java.awt.GraphicsEnvironment; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextPane; import javax.swing.text.AttributeSet; import javax.swing.text.Element; import javax.swing.text.MutableAttributeSet; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; import javax.swing.text.StyledEditorKit; public class MainClass { public MainClass() { JFrame frame = new JFrame(); JTextPane textPane = new JTextPane(); JScrollPane scrollPane = new JScrollPane(textPane); JPanel north = new JPanel(); JMenuBar menu = new JMenuBar(); JMenu styleMenu = new JMenu(); styleMenu.setText("Style"); Action boldAction = new BoldAction(); boldAction.putValue(Action.NAME, "Bold"); styleMenu.add(boldAction); Action italicAction = new ItalicAction(); italicAction.putValue(Action.NAME, "Italic"); styleMenu.add(italicAction); Action foregroundAction = new ForegroundAction(); foregroundAction.putValue(Action.NAME, "Color"); styleMenu.add(foregroundAction); Action formatTextAction = new FontAndSizeAction(); formatTextAction.putValue(Action.NAME, "Font and Size"); styleMenu.add(formatTextAction); menu.add(styleMenu); north.add(menu); frame.getContentPane().setLayout(new BorderLayout()); frame.getContentPane().add(north, BorderLayout.NORTH); frame.getContentPane().add(scrollPane, BorderLayout.CENTER); frame.setSize(800, 500); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } public static void main(String[] args) { new MainClass(); } } class BoldAction extends StyledEditorKit.StyledTextAction { private static final long serialVersionUID = 9174670038684056758L; public BoldAction() { super("font-bold"); } public String toString() { return "Bold"; } public void actionPerformed(ActionEvent e) { JEditorPane editor = getEditor(e); if (editor != null) { StyledEditorKit kit = getStyledEditorKit(editor); MutableAttributeSet attr = kit.getInputAttributes(); boolean bold = (StyleConstants.isBold(attr)) ? false : true; SimpleAttributeSet sas = new SimpleAttributeSet(); StyleConstants.setBold(sas, bold); setCharacterAttributes(editor, sas, false); } } } class ItalicAction extends StyledEditorKit.StyledTextAction { private static final long serialVersionUID = -1428340091100055456L; public ItalicAction() { super("font-italic"); } public String toString() { return "Italic"; } public void actionPerformed(ActionEvent e) { JEditorPane editor = getEditor(e); if (editor != null) { StyledEditorKit kit = getStyledEditorKit(editor); MutableAttributeSet attr = kit.getInputAttributes(); boolean italic = (StyleConstants.isItalic(attr)) ? false : true; SimpleAttributeSet sas = new SimpleAttributeSet(); StyleConstants.setItalic(sas, italic); setCharacterAttributes(editor, sas, false); } } } class ForegroundAction extends StyledEditorKit.StyledTextAction { private static final long serialVersionUID = 6384632651737400352L; JColorChooser colorChooser = new JColorChooser(); JDialog dialog = new JDialog(); boolean noChange = false; boolean cancelled = false; public ForegroundAction() { super("foreground"); } public void actionPerformed(ActionEvent e) { JTextPane editor = (JTextPane) getEditor(e); if (editor == null) { JOptionPane.showMessageDialog(null, "You need to select the editor pane before you can change the color.", "Error", JOptionPane.ERROR_MESSAGE); return; } int p0 = editor.getSelectionStart(); StyledDocument doc = getStyledDocument(editor); Element paragraph = doc.getCharacterElement(p0); AttributeSet as = paragraph.getAttributes(); fg = StyleConstants.getForeground(as); if (fg == null) { fg = Color.BLACK; } colorChooser.setColor(fg); JButton accept = new JButton("OK"); accept.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { fg = colorChooser.getColor(); dialog.dispose(); } }); JButton cancel = new JButton("Cancel"); cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { cancelled = true; dialog.dispose(); } }); JButton none = new JButton("None"); none.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { noChange = true; dialog.dispose(); } }); JPanel buttons = new JPanel(); buttons.add(accept); buttons.add(none); buttons.add(cancel); dialog.getContentPane().setLayout(new BorderLayout()); dialog.getContentPane().add(colorChooser, BorderLayout.CENTER); dialog.getContentPane().add(buttons, BorderLayout.SOUTH); dialog.setModal(true); dialog.pack(); dialog.setVisible(true); if (!cancelled) { MutableAttributeSet attr = null; if (editor != null) { if (fg != null && !noChange) { attr = new SimpleAttributeSet(); StyleConstants.setForeground(attr, fg); setCharacterAttributes(editor, attr, false); } } } // end if color != null noChange = false; cancelled = false; } private Color fg; } class FontAndSizeAction extends StyledEditorKit.StyledTextAction { private static final long serialVersionUID = 584531387732416339L; private String family; private float fontSize; JDialog formatText; private boolean accept = false; JComboBox fontFamilyChooser; JComboBox fontSizeChooser; public FontAndSizeAction() { super("Font and Size"); } public String toString() { return "Font and Size"; } public void actionPerformed(ActionEvent e) { JTextPane editor = (JTextPane) getEditor(e); int p0 = editor.getSelectionStart(); StyledDocument doc = getStyledDocument(editor); Element paragraph = doc.getCharacterElement(p0); AttributeSet as = paragraph.getAttributes(); family = StyleConstants.getFontFamily(as); fontSize = StyleConstants.getFontSize(as); formatText = new JDialog(new JFrame(), "Font and Size", true); formatText.getContentPane().setLayout(new BorderLayout()); JPanel choosers = new JPanel(); choosers.setLayout(new GridLayout(2, 1)); JPanel fontFamilyPanel = new JPanel(); fontFamilyPanel.add(new JLabel("Font")); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); String[] fontNames = ge.getAvailableFontFamilyNames(); fontFamilyChooser = new JComboBox(); for (int i = 0; i < fontNames.length; i++) { fontFamilyChooser.addItem(fontNames[i]); } fontFamilyChooser.setSelectedItem(family); fontFamilyPanel.add(fontFamilyChooser); choosers.add(fontFamilyPanel); JPanel fontSizePanel = new JPanel(); fontSizePanel.add(new JLabel("Size")); fontSizeChooser = new JComboBox(); fontSizeChooser.setEditable(true); fontSizeChooser.addItem(new Float(4)); fontSizeChooser.addItem(new Float(8)); fontSizeChooser.addItem(new Float(12)); fontSizeChooser.addItem(new Float(16)); fontSizeChooser.addItem(new Float(20)); fontSizeChooser.addItem(new Float(24)); fontSizeChooser.setSelectedItem(new Float(fontSize)); fontSizePanel.add(fontSizeChooser); choosers.add(fontSizePanel); JButton ok = new JButton("OK"); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { accept = true; formatText.dispose(); family = (String) fontFamilyChooser.getSelectedItem(); fontSize = Float.parseFloat(fontSizeChooser.getSelectedItem().toString()); } }); JButton cancel = new JButton("Cancel"); cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { formatText.dispose(); } }); JPanel buttons = new JPanel(); buttons.add(ok); buttons.add(cancel); formatText.getContentPane().add(choosers, BorderLayout.CENTER); formatText.getContentPane().add(buttons, BorderLayout.SOUTH); formatText.pack(); formatText.setVisible(true); MutableAttributeSet attr = null; if (editor != null && accept) { attr = new SimpleAttributeSet(); StyleConstants.setFontFamily(attr, family); StyleConstants.setFontSize(attr, (int) fontSize); setCharacterAttributes(editor, attr, false); } } }