ブロッカ後日談とWindowsの作法

昨日アップしたBlockerだが、ブロック時にJOptionPane等でTopMostにダイアログを表示するとダイアログ上のキーボード入力も出来なくなってしまうことに気がついた。
ダイアログを表示する場合にはBlockerを使わないか、又はダイアログの表示時のみはガードしていたマウス入力とキーボード入力を一時的に許可することが必要だろう。

JOptionPaneのことを書いたのでついでに話題にするが、Swingが用意しているダイアログ系のクラスはどれも便利なのだが、Windowsのダイアログ上でのお作法である

  • 確認の用途で使うダイアログは一番上のレイヤにアプリケーションモーダルで表示
  • Enterキー押下はデフォルトボタンの押下と同じアクション
  • ESCキー押下はキャンセル(Close)動作と同じアクション
  • 隣り合うボタンのフォーカス遷移は矢印キーで可能
  • OK/CANCELやYES/NOの選択肢がある場合、デフォルトはCANCEL又はNO。(これは必ずしもそうだとは限らないが)

これら全ては実装されていないので合わせるのが非常に面倒だ。

無論、これらの振る舞いがWindows「だけ」の標準であり、他のO/Sでは常識でないことはおろか実装すらされていないことも知っているが、Swingの一番やっかいな点の一つは、このような、そもそもGUIという瑣末だがしかし重要な振る舞いに対して非常に細かいプログラミングが要求される分野にも関わらず、全てのO/Sで動作する可能性の高い「最大公約数」的な実装がなされているところだろう。

愚痴っても仕方が無いし、Delphiの時にも苦労させられた点なので(当時のVCLはやはりWindowsとしてのGUI操作標準を無視した振る舞いが多々存在していた)細かく実装していくしかないんだけど。

本当は面倒なんで、LookAndFeelもMetalにしてどのO/Sの操作標準にも準拠しないことを逆手にとった使い方をしたいんだけど、クライアント(顧客の意味ね)の要求を考えるとまず無理だろう。