processingで選択ダイアログを表示する

#目次　
- はじめに
2. 実装
    3. 概要
    4. レイアウト
    5. `JOptionPane.showConfirmDialog();`を扱う
3. おわりに


#はじめに
　processingで`exit();`処理を行う前に選択ダイアログで確認をしようとした際に、方法がわからずつまずきました…
　(こういうやつですよね↓)

![dialog.png](https://qiita-image-store.s3.amazonaws.com/0/230703/8fb857b3-99ff-cdf2-77e2-4133ac07266e.png)

　調べても簡潔に説明しているページがなかったため、超初心者の自分用にまとめました。今回はJavaのSwingの`JOptionPane`クラスを使用しました。
　processingのバージョンは**3.3.4**です。

#実装

```Java:dialog.pde
import java.awt.*;
import javax.swing.*;

JPanel panel = new JPanel();    //パネルを作成
BoxLayout layout = new BoxLayout( panel, BoxLayout.Y_AXIS );    //メッセージのレイアウトを決定

void setup(){
  panel.setLayout(layout);    //panelにlayoutを適用
  panel.add( new JLabel( "終わりますか？" ) );    //メッセージ内容を文字列のコンポーネントとしてパネルに追加
}

void draw(){
  int r = JOptionPane.showConfirmDialog( 
    null,    //親フレームの指定
    panel,    //パネルの指定
    "hogehoge",    //タイトルバーに表示する内容
    JOptionPane.YES_NO_OPTION,    //オプションタイプをYES,NOにする
    JOptionPane.INFORMATION_MESSAGE   //メッセージタイプをInformationにする
  );

  if ( r == 0 ) {    
    //YESが選択された場合の処理
  } else if ( r == 1 ) {
    //NOが選択された場合の処理
  }
}
```

上記のコードで以下のようなダイアログメッセージが表示されます。

![dialog2.png](https://qiita-image-store.s3.amazonaws.com/0/230703/c4c3c1b0-c878-4b6f-f030-24845ec04455.png)

##1. 概要
####- `JPanel`クラスでパネルを作成
####- `BoxLayout`クラスでパネルにレイアウトを指定
　`JPanel`クラスの`setLayout();`メソッドを使用して指定します。`void setup()`の中に書く必要があります。
####- `JLabel`クラスでパネルに文字列コンポーネントを追加
　`JPanel`クラスの`add();`メソッドでパネルにコンポーネントを追加します。今回はメッセージなので文字列です。`void setup()` の中に書く必要があります。
####- `JOptionPane`クラスの`showConfirmDialog();`メソッドを用いてオプションタイプとメッセージタイプを指定    
　後に詳しく書きます。

##2. レイアウト
　`BoxLayout`クラスがこれに当たります。上記のコードで使用しているパラメータの`BoxLayout.Y_AXIS`では、コンポーネントを上から下に配置します。
　`BoxLayout`クラスについての詳しい説明は以下の記事を参考にされると良いと思います。
>BoxLayoutクラス - Swing - JavaDrive
[https://www.javadrive.jp/tutorial/boxlayout/](https://www.javadrive.jp/tutorial/boxlayout/)

##3. `JOptionPane.showConfirmDialog();`を扱う
　`JOptionPane.showConfirmDialog(引数1,引数2,引数3,引数4,引数5);`
　各引数、返り値について触れます。
####引数1
　ダイアログを表示するための親フレームを指定します。上記のコードでは、選択ダイアログのみを表示するので、親フレームはなく、`null`をいれました。
####引数2
　ここでパネルを指定します。これまでに`.setLayout();`でレイアウトを決定、`.add();`で文字列のコンポーネントを追加させたパネルを指定します。上記のコードでは`panel`が該当します。
####引数3
　ダイアログのタイトルを指定します。String型の値を用います。
####引数4
　オプションタイプ(YESorNO、はいor取消といった選択肢のボタン)の指定をします。上記のコードでは`JOptionPane.YES_NO_OPTION`というパラメータで、選択肢がYESとNOになっています。
　パラメータと表示されるボタンの関係は以下の通りです。

|パラメータ|表示されるボタン|
|:--------|:--------------|
|JOptionPane.YES_NO_OPTION|YES/NO|
|JOptionPane.YES_NO_CANCEL_OPTION|YES/NO/取消|
|JOptionPane.OK_CANCEL_OPTION|OK/取消|

####引数5
　ダイアログのメッセージタイプ(選択ダイアログの中にある「警告」や「情報」などの種類)を指定します。上記のコードに書かれているパラメータ`JOptionPane.INFORMATION_MESSAGE`は、この種類を「情報」に指定します。
　パラメータとメッセージタイプの関係は以下の表の通りです。

|パラメータ|メッセージタイプ|
|:----|:----|
|JOptionPane.ERROR_MESSAGE	|エラーメッセージ|
|JOptionPane.INFORMATION_MESSAGE	|情報メッセージ|
|JOptionPane.WARNING_MESSAGE	|警告メッセージ|
|JOptionPane.QUESTION_MESSAGE	|質問メッセージ|
|JOptionPane.PLAIN_MESSAGE	|アイコン非表示|

####返り値
　返り値はint型の値として返されます。上記のコードでは`r`に格納されます。
　選択ボタンと返り値の関係は以下の表の通りです。

|選択したボタン|返り値|
|:----|:----|
|OK|0|
|YES|0|
|NO|1|
|取消|2|

　以下は私が参考にさせていただいたサイトです。詳細についてはこのサイト参照していただけると良いと思います。
>メッセージタイプを指定して選択ダイアログを表示する - JOptionPaneクラス - Swing - JavaDrive
[https://www.javadrive.jp/tutorial/joptionpane/index7.html](https://www.javadrive.jp/tutorial/joptionpane/index7.html)

#おわりに
　いかがでしたでしょうか？
　選択ダイアログを表示するには、毎回`JOptionPane.showConfirmDialog();`を実行し、int型変数に値を代入し直さなければいけません。当然ですが、上記のコードのように`void draw()`直下に書いてしまうと、`draw()`が実行される度にダイアログが表示されてしまいプログラムが止まってしまうため、書く場所には気を付けます。

　はじめて記事を書いたため、至らない点があるとは思いますが、その際はご指摘いただけると嬉しいです。ありがとうございました。