問題タブ [keyboardfocusmanager]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - フォーカスされていないコンポーネントへの KeyEvents のディスパッチ
シナリオは次のとおりです。2 つの Java アプリケーションがあります。1 つ目は、Swing GUI を使用するビジュアル アプリケーションで、すべてが非常に複雑な動作 (非常に古いコード ベース) を持つ JFrame にまとめられており、変更することはできません。JFrame オブジェクトへのフックがあるだけです。
2 番目のアプリケーションは、私が書いているもので、基本的には最初のアプリケーションのユニット テスターです。JFrame フックと JDI を使用して、これらのテストを実行するために必要なすべてのイントロスペクションを行うことができました。実際、私のテストはうまくいっているので、バックグラウンドで実行したいと思っています。ただし、私のテストの多くは KeyEvents と MouseEvents を JFrame にディスパッチする必要があるため、ウィンドウがフォーカスを失うとこれらは停止します。私が読んだことから、これはデフォルトの KeyboardFocusManager の要件が原因のようです。これは、これらのイベントを、表示され、フォーカスされているコンポーネントにのみディスパッチします (これには、それらを含むウィンドウが表示され、フォーカスされている必要もあります)。これは私の質問に私をもたらします:
KeyboardFocusManager がプロセスを停止することなく、特定のスイング コンポーネントにイベントを「強制的に」ディスパッチするにはどうすればよいですか?
重要な注意: これらのイベントをディスパッチしたいコンポーネントは、永続的なフォーカス所有者としても登録されます。これにより、ウィンドウがフォーカスされていないときにどのコンポーネントがイベントを受け取るべきかというあいまいさを取り除くことができます (KeyboardFocusManager.getGlobalPermanentFocusOwner())
イベントの作成方法: (かなり単純なもの)
私が試したこと(そしてなぜそれらがうまくいかなかったのか):
Component.dispatchEvent(event) を介してイベントをディスパッチします。コンポーネントが KeyboardFocusManager を介してルーティングされるため (奇妙なことに)、コンポーネントを表示する必要があるため、これは機能しません。
上記の理由により、KeyboardFocusManager.dispatchEvent(event) を介してイベントをディスパッチします。
Component.requestFocus() または .requestFocusInWindow() を呼び出すと、イベントを配信できますが、ウィンドウ コンテナーも強制的にフォーカスされ、ウィンドウが前面に表示されるため、うまくいきません。
パーマネント フォーカス オーナーのリスナーを繰り返し処理し、カスタム イベントでイベント関数を呼び出します。これが機能しなかった理由は正確にはわかりませんが、通常のアプリケーション機能でさまざまなフォーカス所有者を介した伝播が行われていないことに関係があると思われます。
これが私の現在の pushEventToQueue 関数で、失敗したコメントアウトされた部分が含まれています。
現在考えられる唯一の方法は、KeyboardFocusManager クラスを拡張し、現在の JVM にウィンドウがない場合に、選択したフォーカスされていないコンポーネントにフォーカスをデフォルト設定する機能を追加することです。フォーカスがあります (つまり、すべての Java ウィンドウがバックグラウンドにあります)。デフォルト以外の動作を示す唯一のケースは、すべてのウィンドウがフォーカスされていない場合であるため、これによって既存のプログラム機能が妨げられないことが理想的です。
swing アプリケーションのコード ベースを変更できません。つまり、KeyListeners の代わりに KeyBindings を実装することも、swing コンポーネントの isFocused/isShowing メソッドをオーバーライドすることもできません。私にできることは、リフレクションまたは JDI が提供するものであれば何でも構いませんが、この場合は少し役に立たないようです。
誰もこれを経験していますか?誰でもガイダンスを提供できますか?
java - KeyboardFocusManager の問題、Maven と IDE のビルド
既存の Java アプリにキーボード ショートカットを追加しようとしています。関連する部分は次のとおりです。
現在、キーボード フォーカス システムは、ソフトウェア レンダリングで期待どおりに機能します。ただし、GL レンダリング サポートが追加されたため、動作が異なります。プログラムを起動すると、キーボード マネージャーは正常に動作します。の子オブジェクトにMain
フォーカスがあり、フォーカス マネージャは で定義されているように動作しMain
ます。ただし、ストリームビデオボタンをクリックすると、つまり。Jviewer 内の内部 JPanel が初めてレンダラーされると、同じボタンとパネルがフォーカスを維持しますが、キーボード マネージャーが突然動作しなくなります。キーボードを再び機能させるには、Jviewer またはボタンなどの GUI ツールをクリックするか、プログラムでタブアウトしてからタブインする必要があります。その後、正常に動作します。また、これはストリームが最初に読み込まれたときにのみ発生します。
また、この動作は私の Windows マシンでのみ発生し、Linux マシンは同じ (maven) ビルドを問題なく処理することにも注意してください。興味深いのは、IntelliJ ビルド環境で JDK Java 1.6.0.39 を使用して同じプログラムを実行すると、Windows でも正常に動作することです。
私の質問は次のとおりです。
- 問題の原因は何ですか? これらの内部ストリーム JPanels のレンダリング後、Jviewer はどういうわけか「再検証」されませんか?
- 同じビルドが Windows では機能するのに Linux では機能しないのはなぜですか? ルックアンドフィールと何か関係がありますか?
- Windows では、IntelliJ ビルドが正常に動作し、Maven ビルドが動作しないのはなぜですか? ライブラリなどを検索するためのパスのセットが異なるようです。
フォーカス サブシステムは、使用する をどのように決定し
KeyboardFocusManager
ますか? 次のようなものはありますか:getCurrentKeyboardFocusManager().isItBlank()
またはそのコンテンツをプログラムでチェックする方法はありますか?残念ながら、プロジェクトはかなりモジュール化されており、「メイン」パッケージが「Swing」をインポートし、Java が循環依存を好まないため、「swing パッケージ」でキーボード ショートカットのアクションを定義できません。そうでない場合は、Jviewer を含む各子オブジェクトのキーボード マネージャーを個別に定義できますが、できません。特定のウィンドウ内のすべてのコンポーネントが同じを使用するように設定するプロパティはあります
KeyboardFocusManager
か?
参考までに、Maven バージョン: 3.2.5 で、IDE と同じ Java JDK を使用しています。
c# - フォーカスされたハイパーリンクから親 RichTextBox を見つける
設定:ハイパーリンク
を含むRichTextBoxとUI の別の場所があります。ボタンをクリックして開いた後、UI の別の場所をクリックすると、閉じるように実装され、キーボードフォーカスがまだ所有されているかどうかを確認して、意図したとおりに折りたたんだ後に再びフォーカスを設定できるようにします。DropDownButton
DropDown
DropDown
ToggleButton
DropDown
問題:
内部をクリックすると、フォーカスの所有権を確認する方法が原因でRichTextBox
あることに直面します。InvalidOperationException
への呼び出しVisualTreeHelper.GetParent(potentialSubControl)
は、VisualTree の一部であるすべての要素に対して正常に機能します。どうやらフォーカスHyperlink
された ( によって返されるFocusManager.GetFocusedElement()
) は VisualTree の一部ではないため、 への無効な入力GetParent()
です。では、ハイパーリンクの親 (論理的な親または視覚的な親) を my 内で見つけるにはどうすればよいRichTextBox
でしょうか?
フォーカスの所有権を決定するための私の方法:
[編集] 問題を解決するための 1 つの考えられるアイデア: Hyperlink は であるため、その継承コンテキストDependencyObject
にアクセスして、ツリーの上位にある他のものを見つけて、それらが であることをテストできます。しかし、Silverlight の継承コンテキストに関する情報を見つけるのに苦労しています。DependencyObjects
FrameworkElements
c# - KeyBoard focus wpf : 別の UserControls TreeView から TAB を押したときに、KeyBoard Focus を DataGrids の最初の行に設定します。
私は 2UserControls
つ持ってTreeView
いButton
ますDataGrid
。
私が達成しようとしているのは、2 番目の UserControl で KeyBoard フォーカスを DataGrid に与える必要がある場合Tab
ですTreeViewItem
。
さまざまな投稿を調べましたが、運がありません。以下の私のXAMLを見つけて、
質問の簡略化された XAML。
UserControl
イベントを追加して、フォーカスを秒に設定しようとしましたPreviewKeyDown
しかし、これにより、上記のように DataGrid ではなく USerControl に焦点が当てられます。
にしようとAttach
しProperty
ましたDataGrid
。期待どおりに機能しましたが、に焦点を当てていませんでしたfirst row
。このスレッドはそのための入力を与えられました。
解決しました:)
上記のスレッドで言及されているものを作成しAttachedProperty
、コールバック メソッドを変更して、DataGrids
以下のように最初の行にフォーカスを設定しました。
より良い解決策を自由に追加してください。前もって感謝します。
c# - UWP キー プレス イベントの処理が遅すぎて、キーボード フォーカス アクションが妨げられる
テレビを制御する UWP アプリがあります。いくつかのボタン、チェックボックスなど、およびキーボード コントロール/イベントがあります。この組み合わせは問題を引き起こします。チェックボックスをオンにしてからVirtualKey.Subtractを押すと、チェックボックスがオフになり、キーボードから変更したくありません。e.Handled の使用は機能していないようです。
UWP アプリで既定のキーボード ナビゲーション動作またはキーボード フォーカスを無効にするにはどうすればよいですか?
この質問が重複している可能性がある場合は申し訳ありませんが、UWP (ユニバーサル Windows プラットフォーム) では異なると思います。
java - KeyboardFocusManager を使用してキーが押されたときにキャレットの位置を取得する
KeyboardFocusManager を使用して、「<」文字が入力されたときに現在のキャレット位置を取得しようとしています。以下のコード。文字を入力したときにテキスト フィールドが空の場合、キャレットの位置は 0 であると予想されます。ただし、実際に得られる結果は次のとおりです: 0 0 1。