• 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全体への入力操作をブロックします。

サンプルコード

#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の表示を途中で中断する方法がない

参考リンク

コメント