アプリ終了時にダイアログを表示するサンプルプログラム
ウインドウ(Stage)右上の×ボタンを押してプログラムを終了するとき、
データを保存していない場合は閉じずにダイアログ(Alert)を表示して確認するサンプルプログラムを紹介します。
JavaFXではsetOnCloseRequesを使う
JavaFXの場合
stageのsetOnCloseRequest内で記述する。
下の1行を追記すると、×ボタン楽天 を押しても終了できなくなります。
stage.setOnCloseRequest((WindowEvent event) -> { event.consume(); } );
データのの保存状況を示すフラグ(file)を作っておき、保存していればそのまま終了、未保存であればダイアログを開くには、下記のように記述します。
stage.setOnCloseRequest((WindowEvent event) -> {
//ファイルの状態で場合分け
if( file == false ){
Alert alert = new Alert( AlertType.CONFIRMATION , "データが保存されていません。終了しますか?" , ButtonType.YES , ButtonType.NO );
ButtonType button = alert.showAndWait().orElse( ButtonType.CANCEL );
System.out.println( button.getText() );
//はいボタンが押されたら終了、いいえなら終了せずに戻る
if(
button.getText().equals("はい") ){ System.exit(0); }
else{
event.consume();
}
}else{ System.exit(0); }
});
サンプルプログラム
下のプログラムを実行画面が上の動画です。
×ボタンをクリックするとファイルの状態によってダイアログを表示させ、終了前の確認ダイアログを表示させています。
選択ボタンがいいえなら終了せずに元に戻り、はいなら終了します。
package tomojavalib.fx;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.layout.*;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
public class EndTest extends Application {
boolean file = false;
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage stage) throws Exception {
BorderPane pane = new BorderPane();
Scene scene = new Scene(pane, 320, 240);
stage.setOnCloseRequest((WindowEvent event) -> {
//ファイルの状態で場合分け
if( file == false ){
Alert alert = new Alert( AlertType.CONFIRMATION , "データが保存されていません。終了しますか?" , ButtonType.YES , ButtonType.NO );
ButtonType button = alert.showAndWait().orElse( ButtonType.CANCEL );
System.out.println( button.getText() );
//はいボタンが押されたら終了、いいえなら終了せずに戻る
if(
button.getText().equals("はい") ){ System.exit(0); }
else{
event.consume();
}
}else{ System.exit(0); }
});
stage.setScene(scene);
stage.show();
}
}
JavaSwingの場合
Swingでは、まず×ボタンを押しても閉じない設定にしておき、
this.setDefaultCloseOperation(Jframe.DO_NOTHING_ON_CLOSE);
windowClosingイベントの中でダイアログを表示さます。
class frameClose implements WindowListener{
public void windowIconified(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowDeiconified(WindowEvent e) {}
public void windowOpened(WindowEvent e){}
public void windowDeactivated(WindowEvent e) {}
public void windowClosing(WindowEvent e){
if(Frame.this.filejoutai==2){
int ans = JOptionPane.showConfirmDialog(Frame.this, "保存していません。本当に終了しますか?","ファイル保存確認",0);
if(ans == JOptionPane.YES_OPTION) {System.exit(0);}
}else{ System.exit(0); }
}
public void windowClosed(WindowEvent e){
}
}
JavaSwingのサンプルプログラム
{
//サイズ設定
this.setBounds(500, 500, 320, 240);
//イベントの設定
this.setEvent();
}
private void setEvent()
{
//×ボタンを押しても何もしない
this.setDefaultCloseOperation(Jframe.DO_NOTHING_ON_CLOSE);
//ウインドウ関連イベント
addWindowListener(new frameClose());
}
public static void main(String[] args) {
EndTestSwing ets = new EndTestSwing();
ets.setVisible(true);
}
class frameClose implements WindowListener{
public void windowIconified(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowDeiconified(WindowEvent e) {}
public void windowOpened(WindowEvent e){}
public void windowDeactivated(WindowEvent e) {}
public void windowClosing(WindowEvent e){
if(EndTestSwing.this.file==false){
int ans = JOptionPane.showConfirmDialog(EndTestSwing.this, "保存していません。本当に終了しますか?","ファイル保存確認",0);
if(ans == JOptionPane.YES_OPTION) {System.exit(0);}
}else{ System.exit(0); }
}
public void windowClosed(WindowEvent e){
}
}
}
最終更新日: 2017-12-12 09:30:30