Wie lässt sich ein Hilfedialog realisieren?

Ein Hilfedialog zur Anzeige einer HTML-Hilfe-Datei lässt sich mit einem JTextPane innerhalb eines Dialogfensters realisieren.

Im Beispiel wird ein leerer JFrame mit einer MenuBar erzeugt. Sie enthält lediglich den Punkt "Hilfe" zum Aufruf des Hilfedialogs und wird durch die Methode createMenuBar() (Zeile 30) zurückgegeben. Das JMenuItem "Hilfe" wird bei einem ActionListener angemeldet, der die Erzeugung einer Instanz des Hilfedialogs anstößt (Zeile 32).

import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.io.IOException;
import java.net.URL;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;

public class HilfeDialogBsp {
    public HilfeDialogBsp() {
        init();
    }

    private void init() {
        JFrame frame = new JFrame();

        frame.setJMenuBar(createMenuBar(frame));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Hilfedialog-Beispiel");
        frame.setSize(400, 400);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JMenuBar createMenuBar(JFrame frame) {
        JMenuItem item = new JMenuItem("Hilfe");
        item.addActionListener(e -> new HilfeDialog(frame));
        JMenuBar mBar = new JMenuBar();
        mBar.add(item);
        return mBar;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new HilfeDialogBsp());
    }
}

class HilfeDialog {

    private JTextPane textPane;
    private JScrollPane scrollPane;

    public HilfeDialog(JFrame frame) {

        textPane = new JTextPane();
        textPane.setEditable(false);
        textPane.setContentType("application/xhtml+xml");

        try {
            URL url = this.getClass().getClassLoader().getResource("test/hilfe.html");
            if (url != null)
                textPane.setPage(url);
        } catch (IOException | RuntimeException e) {
            e.printStackTrace();
        }

        scrollPane = new JScrollPane(textPane);
        JDialog dialog = new JDialog(frame);
        dialog.add(scrollPane, BorderLayout.CENTER);
        dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
        dialog.setSize(Toolkit.getDefaultToolkit().getScreenSize());
        dialog.setVisible(true);
    }
}

Der Konstruktor der Klasse HilfeDialog bekommt den Hauptframe als Argument übergeben. Diese Referenz wird an den Konstruktor des JDialog weitergereicht (Zeile 63). Hierdurch wird bei Anwendungen mit mehreren Fenstern festgelegt, zu welchem der Dialog gehört. Die Angabe beim Aufruf des JDialog-Konstruktors ist optional.

Zentral auf den Dialog wird eine JTextPane gesetzt, die nicht editiert werden kann und als Inhaltstyp den MIME-Type application/xhtml+xml definiert (Zeile 52). Auf diese Weise kann eine weitgehend frei vorformatierte HTML-Datei gezeigt werden.
Sie wird innerhalb eines try-catch-Blockes durch den ClassLoader als URL geladen und bei Erfolg mit einer JScrollPane auf die JTextPane gesetzt (Zeile 57).