gwt アプリの一部の画面で、入力フォームを含むダイアログ ボックスを作成します。tabindex プロパティを使用できるようにしたいのですが、そのダイアログ ボックス内でのみ使用できます。(つまり、そのダイアログボックスの最初のフィールドから最後のフィールドのみを循環します)現在、最後のフィールドが選択されているときにタブを押すと、ダイアログボックスの背後にあるアイテムである最初のタブインデックスにフォーカスが移動します(ガラスとして設定) )。フォーカスが最初のダイアログ ボックス フィールドに戻るまで、タブを何度も押さなければならないので、これは非常に面倒です。ダイアログ ボックスをモーダルに設定すると、ダイアログ ボックスの外側でタブを押すとすぐに、タブ キーが無視されます。これは、ダイアログ ボックスの外側のオブジェクトがキーボード イベントを受け取らなくなる (タブ アウトできない!) ためです。タブキーをリッスンして手動でタブを処理する唯一のオプションはありますか? その下のすべての要素を通過する必要なくダイアログボックスに戻る限り、アプリの外や URL バー (たとえば) にタブを移動しても問題ありません。
2 に答える
まあ、遅刻はしないよりはましです!私は同じ問題を抱えていました。解決策は実際には非常に簡単です。
Composite
データ入力用のウィジェットとボタンを継承し、それらを含むダイアログ ボックスがあるとします。メイン ウィンドウには、入力フィールドやボタンなどの UI ウィジェットもいくつか含まれています。このメイン ウィンドウのタブ オーダーを設定します。ボタンが押されてダイアログ ボックスが表示されたら、setTabIndex(-1)
タブ オーダーを無効にするメイン ウィンドウ ( ) の各コントロールを設定します。
新しいダイアログ ボックスでは、次のコードをコンストラクターに登録します。
this.addAttachHandler( new AttachEvent.Handler() {
@Override
public void onAttachOrDetach(AttachEvent event) {
if(isAttached()) {
setTabOrder();
} else {
clearTabOrder();
}
}
});
次に、必要に応じて呼び出される 2 つのメソッドsetTabOrder()
を作成clearTabOrder()
します。GWT は、タブ オーダーを持つ複数のウィンドウと混同されるようです。各ダイアログ ウィンドウの表示/非表示時にタブ オーダーを動的に作成することで、混乱を解消できます。
ほぼ 1 か月間、回答が得られなかったので、手動でタブ キーを操作することにしました。魅力のように機能しますが、タブサイクルの URL バーを無視するようになりました (私には問題ありません)。このブログ投稿を使用して作業を進めました: http://albertattard.blogspot.com/2009/11/capturing-tab-key-in-gwt-textarea.html ダイアログのルートにフォーカス パネルを追加しただけです。