package lecture.swing;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import jp.avaj.lib.swing.PcScreen;

/**
 * エラーメッセージ画面で「詳細」ボタンを押すと、エラーの詳細を表示する Java Swing JOptionPane
 *
 * このような画面はよく見かけるので、JOptionPaneを使って実装した。考え方は次の通り。
 * 1.JOptionPaneのメッセージは普通はStringを指定するがJPanelを指定する。
 * 2.JPanelの中にエラーメッセージと「詳細」ボタンを入れる。
 * 3.「詳細」ボタン押下で詳細メッセージを上記のパネルに追加する。
 *
 * 注意、詳細を追加した時にpack()しなければならないので、showMessageDialogを使うのではなく、
 * JOptionPaneのオブジェクトを生成してからJDialogを生成し表示している。
 *
 * サンプルでは詳細メッセージにJLabelを使っているが、実際はJTextAreaを編集不可の状態で使うとよい。
 * 「詳細」を再度押下すると、詳細メッセージをコピーすると実用的だろう。
 * JPanelだとなんでも入れられるので、例えばエラーとなったデータを再入力させるようなこともできる。
 *
 */
class JOptionPaneDetailMessage extends JFrame implements ActionListener {
  public static void main(String[] args) {
    new JOptionPaneDetailMessage();
  }

  private JOptionPaneDetailMessage() {
    pushBtn = new JButton("push");
    getContentPane().add(pushBtn);
    pushBtn.addActionListener(this);
    pack();
    setVisible(true);
    PcScreen.display(this,PcScreen.POS_CENTER_CENTER);
  }

  /** 詳細メッセージ付きのJOptionPaneのDialogを表示する */
  private void showJOptionPane() {
    // DialogのメッセージとなるPanelを生成する
    {
      messagePanel = new JPanel();
      messagePanel.setLayout(new BorderLayout());
      JPanel upperPanel = new JPanel();
      messagePanel.add(upperPanel,BorderLayout.NORTH);
      upperPanel.setLayout(new BoxLayout(upperPanel,BoxLayout.X_AXIS));
      upperPanel.add(new JLabel("エラーが発生しました"));
      moreBtn = new JButton("詳細");
      upperPanel.add(moreBtn);
      moreBtn.addActionListener(this);
    }
    // JOptionPaneを生成⇒DIalogを作成
    {
      JOptionPane pane = new JOptionPane(messagePanel,JOptionPane.ERROR_MESSAGE,JOptionPane.DEFAULT_OPTION);
      dialog = pane.createDialog(this,"error");
      dialog.pack();
      dialog.setVisible(true);
    }
  }
  @Override
  public void actionPerformed(ActionEvent ev) {
    JButton btn = (JButton)ev.getSource();
    if (btn == pushBtn) {
      showJOptionPane();
    }
    if (btn == moreBtn) {
      JLabel detail = new JLabel("<html>詳細1<br>詳細2</html>");
      messagePanel.add(detail,BorderLayout.CENTER);
      // サイズが変わるのでpack()する
      dialog.pack();
    }
  }
  private JButton pushBtn;
  private JDialog dialog;
  private JPanel messagePanel;
  private JButton moreBtn;
}
//---------------------------------------------------
//・目次 - Swing
//・目次 - Java入門
//・目次 - ビジネスパーソンの常識と非常識
//・目次 - 論理・発想・思考についての考察と鍛え方
//---------------------------------------------------