EditorPaneExample7.java Source code

Java tutorial

Introduction

Here is the source code for EditorPaneExample7.java

Source

/*
Core SWING Advanced Programming 
By Kim Topley
ISBN: 0 13 083292 8       
Publisher: Prentice Hall  
*/

import java.awt.Color;
import java.awt.Cursor;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URL;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.text.EditorKit;

public class EditorPaneExample7 extends JFrame {
    public EditorPaneExample7() {
        super("JEditorPane Example 7");

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

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

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

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

        c.gridx = 1;
        c.gridy = 0;
        c.gridwidth = 1;
        c.weightx = 1.0;
        c.fill = GridBagConstraints.HORIZONTAL;

        textField = new JTextField(32);
        panel.add(textField, c);
        loadingState = new JLabel(spaces, JLabel.LEFT);
        loadingState.setForeground(Color.black);
        c.gridy = 1;
        c.gridwidth = 2;
        panel.add(loadingState, c);
        loadedType = new JLabel(spaces, JLabel.LEFT);
        loadedType.setForeground(Color.black);
        c.gridy = 2;
        panel.add(loadedType, c);

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

        panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        saveButton = new JButton("Save");
        plain = new JCheckBox("Plain Text");
        html = new JCheckBox("HTML");
        rtf = new JCheckBox("RTF");
        panel.add(plain);
        panel.add(html);
        panel.add(rtf);

        ButtonGroup group = new ButtonGroup();
        group.add(plain);
        group.add(html);
        group.add(rtf);
        plain.setSelected(true);

        panel.add(Box.createVerticalStrut(10));
        panel.add(saveButton);
        panel.add(Box.createVerticalGlue());
        panel.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 4));

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

        // Change page based on text field
        textField.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                String fileName = textField.getText().trim();
                file = new File(fileName);
                absolutePath = file.getAbsolutePath();
                String url = "file:///" + absolutePath;

                try {
                    // Check if the new page and the old
                    // page are the same.
                    URL newURL = new URL(url);
                    URL loadedURL = pane.getPage();
                    if (loadedURL != null && loadedURL.sameFile(newURL)) {
                        return;
                    }

                    // Try to display the page
                    textField.setEnabled(false); // Disable input
                    textField.paintImmediately(0, 0, textField.getSize().width, textField.getSize().height);

                    saveButton.setEnabled(false);
                    saveButton.paintImmediately(0, 0, saveButton.getSize().width, saveButton.getSize().height);
                    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                    // Busy cursor
                    loadingState.setText("Loading...");
                    loadingState.paintImmediately(0, 0, loadingState.getSize().width,
                            loadingState.getSize().height);
                    loadedType.setText("");
                    loadedType.paintImmediately(0, 0, loadedType.getSize().width, loadedType.getSize().height);
                    pane.setEditable(false);
                    pane.setPage(url);

                    loadedType.setText(pane.getContentType());
                } catch (Exception e) {
                    JOptionPane.showMessageDialog(pane, new String[] { "Unable to open file", url },
                            "File Open Error", JOptionPane.ERROR_MESSAGE);
                    loadingState.setText("Failed");
                    textField.setEnabled(true);
                    setCursor(Cursor.getDefaultCursor());
                }
            }
        });

        // Listen for page load to complete
        pane.addPropertyChangeListener(new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent evt) {
                if (evt.getPropertyName().equals("page")) {
                    loadingState.setText("Page loaded.");

                    textField.setEnabled(true); // Allow entry of new file name
                    textField.requestFocus();
                    setCursor(Cursor.getDefaultCursor());

                    // Allow editing and saving if appropriate
                    pane.setEditable(file.canWrite());
                    saveButton.setEnabled(file.canWrite());
                }
            }
        });

        saveButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                Writer w = null;
                OutputStream os = System.out;
                String contentType;
                if (plain.isSelected()) {
                    contentType = "text/plain";
                    w = new OutputStreamWriter(os);
                } else if (html.isSelected()) {
                    contentType = "text/html";
                    w = new OutputStreamWriter(os);
                } else {
                    contentType = "text/rtf";
                }

                EditorKit kit = pane.getEditorKitForContentType(contentType);
                try {
                    if (w != null) {
                        kit.write(w, pane.getDocument(), 0, pane.getDocument().getLength());
                        w.flush();
                    } else {
                        kit.write(os, pane.getDocument(), 0, pane.getDocument().getLength());
                        os.flush();
                    }
                } catch (Exception e) {
                    System.out.println("Write failed");
                }
            }
        });
    }

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

        JFrame f = new EditorPaneExample7();
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
                System.exit(0);
            }
        });
        f.setSize(500, 400);
        f.setVisible(true);
    }

    private static final String spaces = "                    ";

    private JEditorPane pane;

    private JTextField textField;

    private JLabel loadingState;

    private JLabel loadedType;

    private JButton saveButton;

    private JCheckBox plain;

    private JCheckBox html;

    private JCheckBox rtf;

    private File file;

    private String absolutePath;
}