• 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: https://lh3.googleusercontent.com/-BlvRwXum2Vc/Vi0ubz6y1mI/AAAAAAAAOE4/XKHozK0runE/s800-Ic42/BlockingDialog.png

概要

Modalで透明なJDialogを表示することで、親のJFrame全体への入力操作をブロックします。

サンプルコード

Window w = SwingUtilities.getWindowAncestor(getRootPane());
JDialog dialog = new JDialog(w, Dialog.ModalityType.DOCUMENT_MODAL); //APPLICATION_MODAL);
dialog.setUndecorated(true);
dialog.setBounds(w.getBounds());
dialog.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
int color = check.isSelected() ? 0x22FF0000 : 0x01000000;
dialog.setBackground(new Color(color, true));
(new Task() {
  @Override public void done() {
    if (!isDisplayable()) {
      cancel(true);
      return;
    }
    dialog.setVisible(false);
  }
}).execute();
dialog.setVisible(true);
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、以下のような設定を行ったJDialogを表示することで、親JFrameのタイトルバー、閉じる、最大化、最小化ボタンを含めて一定時間入力不可にするテストを行っています。

  • モーダル(Dialog.ModalityType.DOCUMENT_MODAL)なJDialogを作成
  • dialog.setUndecorated(true)でタイトルバーなどの装飾を非表示に設定
  • JDialogのカーソルをCursor.WAIT_CURSORに設定
  • JDialogの背景色を透明(完全に透明ではない)に設定
  • 注: このサンプルにはJDialogの表示を途中で中断する方法がない

参考リンク

コメント