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入門
//・目次 - ビジネスパーソンの常識と非常識
//・目次 - 論理・発想・思考についての考察と鍛え方
//---------------------------------------------------