问题标签 [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 - 将 KeyEvent 分派到未聚焦的组件
这是场景:我有两个 java 应用程序。第一个是使用swing GUI 的可视化应用程序,全部封装在一个JFrame 中,它具有非常复杂的行为(非常旧的代码库),我无法更改这些行为。我只是有一个 JFrame 对象的钩子。
第二个应用程序是我正在编写的,它基本上是第一个应用程序的单元测试器。使用 JFrame 钩子和 JDI,我已经能够完成执行这些测试所需的所有自省,并且进展顺利。事实上,我的测试进展顺利,我想在后台运行它们。但是,由于我的许多测试都涉及将 KeyEvents 和 MouseEvents 分派到 JFrame,一旦窗口失去焦点,这些将停止。从我读过的内容来看,这似乎是由于默认的 KeyboardFocusManager 的要求,它只会将这些事件分派给既显示又聚焦的组件(这也要求包含它们的窗口既显示又聚焦)。这让我想到了我的问题:
如何在没有 KeyboardFocusManager 停止其进程的情况下将事件“强制”调度到某些摆动组件?
重要说明:我希望将这些事件分派到的组件也注册为永久焦点所有者,这有助于消除在窗口未聚焦时哪个组件应该接收事件的歧义(KeyboardFocusManager.getGlobalPermanentFocusOwner())
我如何举办活动:(非常简单的东西)
我尝试过的(以及为什么它们不起作用):
通过 Component.dispatchEvent(event) 调度事件。这不起作用,因为它需要组件可见,因为它通过 KeyboardFocusManager 路由(很奇怪)。
出于上述原因,通过 KeyboardFocusManager.dispatchEvent(event) 调度事件。
调用 Component.requestFocus() 或 .requestFocusInWindow() 将允许传递事件,但对我不起作用,因为它们也会强制 Window 容器聚焦,这会将窗口带到前台。
遍历永久焦点所有者的侦听器,并使用我的自定义事件调用事件函数。我不确定为什么这不起作用,但我怀疑这与正常应用程序功能中缺乏通过不同焦点所有者的传播有关。
这是我当前的 pushEventToQueue 函数,其中包含失败的注释部分供您娱乐:
我现在唯一能想到的(我不知道该怎么做)就是扩展 KeyboardFocusManager 类并添加一些功能,当当前 JVM 中没有窗口时,这些功能会将焦点默认为我选择的未聚焦组件有焦点(也就是所有java窗口都在后台)。理想情况下,这不会干扰现有的程序功能,因为它表现出非默认行为的唯一情况是所有窗口都没有聚焦。
我无法更改 swing 应用程序的代码库。这意味着我不能实现 KeyBindings 而不是 KeyListeners,也不能覆盖摆动组件的 isFocused/isShowing 方法。我能做的是反射或 JDI 提供的任何东西,在这种情况下似乎有点没用。
这个事情谁有经验?任何人都可以提供指导吗?
java - KeyboardFocusManager 问题,Maven 与 IDE 构建
我正在尝试将键盘快捷键添加到现有的 Java 应用程序。相关部分如下:
现在,键盘焦点系统的工作方式与软件渲染的预期一样。但是,由于添加了 GL 渲染支持,因此行为有所不同。启动程序后,键盘管理器工作正常。具有焦点的子对象,Main
并且焦点管理器的行为如Main
. 但是,当我单击流视频按钮时,即。当 Jviewer 内部的 JPanel 首次渲染时,虽然相同的按钮和面板保持焦点,但键盘管理器突然停止工作。我将不得不单击 Jviewer 或 gui 工具(如按钮等)或 Tab-out,然后在程序中使用 tab-in 以使键盘再次工作。之后,它工作正常。此外,这只发生在第一次加载流时。
我还应该说,这种行为只发生在我的 windows 机器上,而 linux 机器处理相同的(maven)构建就好了。有趣的是,如果我在 IntelliJ 构建环境中使用 JDK java 1.6.0.39 运行相同的程序,它在 Windows 中也可以正常工作。
我的问题是:
- 是什么导致了问题?在呈现这些内部流 JPanel 之后,Jviewer 是否以某种方式没有“重新验证”?
- 为什么相同的构建在 Windows 中有效,而在 linux 中无效?与 LookAndFeel 有关吗?
- 在 Windows 上,为什么 IntelliJ 构建工作正常而 Maven 构建却不行?他们似乎确实有不同的路径来查找库等。
焦点子系统如何决定
KeyboardFocusManager
要使用的?有没有类似的东西:getCurrentKeyboardFocusManager().isItBlank()
或以编程方式检查其内容的任何方式?不幸的是,该项目是相当模块化的,我无法在我的“swing 包”中定义键盘快捷键的操作,因为我的“主”包导入“Swing”并且 Java 不喜欢循环依赖;如果不是,我可以为每个子对象定义键盘管理器,包括单独的 Jviewer,但我不能!是否有要设置的属性,以便给定窗口中的所有组件都使用相同的
KeyboardFocusManager
?
仅供参考,Maven 版本:3.2.5 并使用与我的 IDE 相同的 Java JDK。
java - 通过 fxml 文件将 TextField 的 JavaFX Tab-Button 排序从“从左到右”更改为“从右到左”
在问之前,我应该说可以在JavaFX 中找到答案:如何更改焦点遍历策略?,但我不寻找任何java代码,我想通过编辑Fxml文件的方式
有一个 FXML 文件,其中包含一些 TextField,我想更改我的 TextField 的焦点遍历策略:我的意思是,在应用程序的开头,光标必须位于 id1 中,然后按 TAB 按钮它必须转到id2 等
!!!!ID1-->ID2-->ID3-->ID4-->ID5-->ID6 !!!
请注意,我的 TextField 的位置应该如下图所示。
因此,为此我更改了 FXML 文件中 textFields 的顺序:
它对我来说很好,但现在我遇到了一个大问题,当我在 HBox 中包装两个 TextField( Id1 和 Id2 )时。这种方法没有给我正确的结果,并且焦点遍历的顺序已经改变。
修改后的 FXML 如下:
结果的屏幕截图如下图所示(如您所见,凝视点已更改为 id2,然后按 Tab 键将光标转到 id1... !!!! ID2-->ID1-->ID3-- >ID4-->ID5-->ID5 !!! )
所以 !?!?当用户单击 TAB 时,如何更改我的 TextField 的焦点遍历。
如果你只有一个 anchorPane 似乎很容易,但如果你有 HBox 它从右侧开始到左侧。
默认情况下,当按下 tab 键时,焦点转移(向右)到下一个组件,但正如我提到的,我想要从左到右!
有什么解决办法吗?
c# - 从内部的重点超链接中找到父 RichTextBox
设置:
我的 UI 中有一个包含超链接和其他位置的RichTextBox。现在,当我单击按钮的打开然后单击 UI 上的其他位置时,将实现关闭,并检查它是否仍然拥有键盘焦点,以便在按预期折叠后再次将其设置为焦点。DropDownButton
DropDown
DropDown
ToggleButton
DropDown
问题:
在我的内部单击时,RichTextBox
我将面临InvalidOperationException
由我检查焦点所有权的方法引起的问题。VisualTreeHelper.GetParent(potentialSubControl)
对作为 VisualTree 一部分的所有元素的调用都可以正常工作。显然,焦点Hyperlink
(由 返回FocusManager.GetFocusedElement()
)不是 VisualTree 的一部分,因此对GetParent()
. 那么,我怎样才能找到我的超链接的父(逻辑父或视觉父)RichTextBox
?
我确定焦点所有权的方法:
[编辑] 解决该问题的一个潜在想法:由于 Hyperlink 是一个DependencyObject
我可以尝试访问它的继承上下文并在树中找到其他DependencyObjects
更高的内容并测试它们是否存在FrameworkElements
。但我很难在 Silverlight 中找到有关继承上下文的任何信息。
c# - 键盘焦点 wpf:当从不同的用户控件 TreeView 按下 TAB 时,将键盘焦点设置为 DataGrids 第一行
我有两个UserControls
一个有一个TreeView
,另一个有一个Button
和一个DataGrid
。
我想要实现的是什么时候应该Tab
在TreeViewItem
第二个 UserControl 中将 KeyBoard Focus 赋予 DataGrid。
我看过不同的帖子,但没有运气。在下面找到我的 XAML,
该问题的简化 XAML。
我试图UserControl
通过添加事件将焦点设置为第二个PreviewKeyDown
但这将重点放在 USerControl 上,而不是上面提到的 DataGrid 上。
试过Attach
了。Property
_ DataGrid
它按预期工作,但没有将重点放在first row
. 这个线程给出了输入。
解决了:)
创建AttachedProperty
上面线程中提到的并修改回调方法以将焦点设置到DataGrids
第一行,如下所示,
请随时添加任何更好的解决方案。提前致谢。
java - 全局事件监听器 JAVA
我想在我的 jframe 中的所有控件上监听键盘事件以显示新窗口,到目前为止这是我的代码:
但问题是当我按下 CTRL + F1 时 FrmManual 窗口总是显示两次 有人可以告诉我为什么吗?
谢谢 ....
c# - UWP 按键事件处理得太晚阻止键盘焦点操作
我有一个控制我的电视的 UWP 应用程序。我有一些按钮、复选框等和键盘控件/事件。这种组合会导致问题。选中复选框时,然后按VirtualKey.stract未选中复选框,我不希望通过键盘进行任何更改。e.Handled 的使用似乎不起作用。
如何禁用 UWP 应用中的默认键盘导航行为或键盘焦点?
对不起,如果这个问题可能是重复的,但我认为 UWP(通用 Windows 平台)是不同的。
java - 使用 KeyboardFocusManager 按下键时获取插入符号位置
我正在尝试使用 KeyboardFocusManager 在键入“<”字符时获取当前插入符号的位置。代码如下。如果在键入字符时文本字段为空,我希望插入符号的位置为 0。但是,我实际得到的结果是:0 0 1。谁能解释为什么会这样?
java - 如何在 Java 中找到当前视图的 JTextField 的名称?
我在 Java 中有一个视图,我在 JTextfields 中输入数据。一个线程并行运行,通过使用下面编写的代码片段从键盘获取输入。现在每当我打电话
经理在哪里
它确实返回当前 JTextField 的文本,但是当我调用以下行时,它返回 null。
为什么会发生这种情况,我应该如何解决这个问题?
java - 输入键作为除 JButton 之外的每个组件的 Tab 键
我正在开发一个 Swing 应用程序,我想在其中输入键作为JFrame
除JButton
组件和对话框之外的所有组件的选项卡键。为此,我将 ENTER 和 TAB 设置为默认的焦点遍历键。
这运作良好,但我希望 ENTER 键作为 Action onJButton
和 Dialog Boxes工作。