2

かなり複雑な Swing GUI を持つ自己署名アプレット (近い将来、CA 署名アプレットになる可能性があります) では、ユーザーが SHIFT キーまたは CONTROL キーを押すたびに検出する必要があります。これをコンポーネント関連の MouseEvents および MouseMotionEvents と組み合わせて使用​​し、いつでも特別なマウス イベント処理を行います。まもなく:

別のコンポーネントでマウス モーション イベントを受信した場合、CONTROL または SHIFT が押されている (押されている) かどうかを検出する必要があります。問題は、ユーザーが関心のあるコンポーネントにマウスを移動する前にシフト/コントロールを押してしまうことです。これが私の本当の「ユーザビリティ」の問題です。

Java 7 update 21 より前は、デフォルトの Toolkit に追加した JVM-global AWTKeyListener を使用してそれを達成できました。これはもはや許可されていません (Java 7 update 21 のセキュリティ要件により、これにもかかわらず、私はアプレットを別個の別の JVM で JNLP 起動していますが、それはまた別の話です)。

それで、私は何を持っていますか:

アプレットの「メイン」パネルに KeyListener を登録しようとしましたが、キー イベントが「飲み込まれた」ようです (キーボード フォーカスを持つ GUI のコンポーネントによって)。

次に、メインパネル (最上位のコンテナー) にキーバインディングを使用して、「シフト」、「コントロール」、および「エスケープ」のバインディングを追加してみました。唯一のバインディングは「エスケープ」用であり、常に「リリース」アクションにヒットします。「Shift」と「Control」はヒット(通知)されません。メインパネルの WHEN_IN_FOCUSED_WINDOW 入力マップを使用しています。

アプリケーション全体で(JVM全体ではなく)キーボードイベントを検出する必要があります。どうすればそれを達成できますか?コンポーネント階層のあるレベルでキーボードイベントを他の方法で「インターセプト」することは可能ですか?

それを達成するために Swing/AWT メソッドをオーバーライドすることは気にしません。解決策を見つけることを切望しています。

そうしないと、顧客が Java を 7 upd 21 に更新するのを思いとどまらせることになるので、何か提案をいただければ幸いです。よろしくお願いします。

アロン

PS: Java で「アプリケーション」グローバル リソースがサポートされないのはなぜですか。オーセンティケーター、キーリスナー、デフォルト ロケールなどに適用されますか? 私たち (アプレット開発者) はアプリケーション レベルでしか必要としませんが、常に JVM グローバル ベースです。

4

1 に答える 1