タツノオトシゴのブログ

主にJavaに関するものです。

JOptionPaneのカスタマイズ

Swingのダイアログを表示するための「JOptionPane」は、独自のパネルを設定可能。
引数の「message」は、実はStringではなく、Object型なのでSwingのコンポーネントが設定可能。

【参考】
http://www.ne.jp/asahi/hishidama/home/tech/java/swing/JOptionPane.html

例として、エラーダイアログを表示する。その際に例外結果をTextAreaとして表示する。

  • JLabelで改行をするには、HTML形式にする必要がある。
  • HTML形式にするためにエスケープが必要なので、Commons Langの「StringEscapeUtils.escapeHtml」を使用している。
import java.awt.Component;

import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import org.apache.commons.lang.StringEscapeUtils;


public void showCustomDialog() {

        final JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        
        // メッセージの組み立て
        // 改行する場合はHTML形式にする
        String message = "あああああああああああああああああ\nああああああああああ\r\nあああ\rああああああ。";
        message = StringEscapeUtils.escapeHtml(message)
                .replaceAll("\r\n", "<br />")
                .replaceAll("\n", "<br />")
                .replaceAll("\r", "<br />");
        final JLabel messageLabel = new JLabel("<html>".concat(message));
        messageLabel.setAlignmentY(Component.TOP_ALIGNMENT);
        messageLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
        panel.add(messageLabel);
        
        // 詳細内容をTextAreaで表示する
        // スクロール付きにする
        final JTextArea detailTextArea = new JTextArea("いいいいいいい\nいい\n\n\n\n\n\n\n\n\n\nいいいいいいいいいいい",
                5, 10);
        detailTextArea.setAlignmentY(Component.BOTTOM_ALIGNMENT);
        detailTextArea.setAlignmentX(Component.CENTER_ALIGNMENT);
        detailTextArea.setEditable(false);
        detailTextArea.setLineWrap(true);
        
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setViewportView(detailTextArea);
        
        panel.add(scrollPane);
        
        // ★通常ならばメッセージを設定する第2引数にPanelを設定する
        JOptionPane.showMessageDialog(null,
                panel,
                "タイトル",
                JOptionPane.ERROR_MESSAGE);
}