Swing/BlockingDialog のバックアップの現在との差分(No.3)
- category: swing folder: BlockingDialog title: Modalで透明なJDialogを使って親のJFrameへの入力をブロックする tags: [JDialog, JFrame] author: aterai pubdate: 2015-10-26T04:45:10+09:00 description: Modalで透明なJDialogを表示することで、親のJFrame全体への入力操作をブロックします。 image:
概要
Modal
で透明なJDialog
を表示することで、親のJFrame
全体への入力操作をブロックします。
Screenshot
Advertisement
サンプルコード
#spandel
Window w = SwingUtilities.getWindowAncestor(getRootPane());
#spanend
#spandel
JDialog dialog = new JDialog(w, Dialog.ModalityType.DOCUMENT_MODAL); //APPLICATION_MODAL);
#spanend
#spandel
dialog.setUndecorated(true);
#spanend
#spandel
dialog.setBounds(w.getBounds());
#spanend
#spandel
dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
#spanend
#spandel
int color = check.isSelected() ? 0x22FF0000 : 0x01000000;
#spanend
#spandel
dialog.setBackground(new Color(color, true));
#spanend
#spandel
(new Task() {
#spanend
@Override public void done() {
if (!isDisplayable()) {
cancel(true);
return;
#spanadd
JButton button = new JButton("Stop 5sec");
#spanend
#spanadd
button.addActionListener(e -> {
#spanend
Window w = SwingUtilities.getWindowAncestor(getRootPane());
JDialog dialog = new JDialog(w, Dialog.ModalityType.APPLICATION_MODAL);
dialog.setUndecorated(true);
dialog.setBounds(w.getBounds());
dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
int color = check.isSelected() ? 0x22_FF_00_00 : 0x01_00_00_00;
dialog.setBackground(new Color(color, true));
new BackgroundTask() {
@Override protected void done() {
if (!isDisplayable()) {
cancel(true);
return;
}
dialog.setVisible(false);
}
dialog.setVisible(false);
}.execute();
dialog.setVisible(true);
#spanadd
});
#spanend
#spanadd
// ...
#spanend
#spanadd
class BackgroundTask extends SwingWorker<String, Void> {
#spanend
@Override protected String doInBackground() throws InterruptedException {
Thread.sleep(5_000);
return "Done";
}
#spandel
}).execute();
#spanend
#spandel
dialog.setVisible(true);
#spanend
#spanadd
}
#spanend
View in GitHub: Java, Kotlin解説
上記のサンプルでは、以下のような設定を行ったJDialog
を表示することで、親JFrame
のタイトルバー、閉じる、最大化、最小化ボタンを含めて一定時間入力不可にするテストを行っています。
上記のサンプルでは、以下のような設定を行ったJDialog
を表示することで親JFrame
のタイトルバー、閉じる、最大化、最小化ボタンを含めて一定時間入力不可にするテストを行っています。
- モーダル(
Dialog.ModalityType.DOCUMENT_MODAL
)なJDialog
を作成 dialog.setUndecorated(true)
でタイトルバーなどの装飾を非表示に設定JDialog
のカーソルをCursor.WAIT_CURSOR
に設定JDialog
の背景色を透明(完全に透明ではない)に設定- 注: このサンプルには
JDialog
の表示を途中で中断する方法がない