问题标签 [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.

0 投票
1 回答
471 浏览

java - 获取对当前 KeyboardFocusManager 的引用

有没有办法在 Swing 应用程序中获取对当前 KeyboardFocusManager 的引用?

0 投票
3 回答
9561 浏览

java - 当 KeyEvent.VK_ENTER 重新分配给它时,如何让 JTextField 触发它的 ActionEvent?

我正在玩弄KeyboardFocusManager我自己的习惯,不管 JFrame 中的焦点如何,都将KeyEventDispatcher所有KeyEvents 重新移到一个特定的 s 上。JTextField就文本输入而言,这就像一种魅力,但我也希望在将 a 重新分派给 a时将JTextField其文本发布到 a 。出于某种原因,它只是不会这样做。如果我将光标放在文本字段中并按 ENTER,我已经在 上设置了一个 actionListener ,但是如果 ENTER 事件来自.JTextAreaKeyEvent.VK_ENTERJTextFieldKeyboardFocusManager.redispatchEvent(keyEvent)

在按下 ENTER 的情况下,我还尝试重新分配 ActionEvent 而不是未更改的 KeyEvent ,但无济于事:( 您会认为将 ActionEvent 分配给组件会触发它的 ActionListeners 但不是。

有人可以解释这是为什么吗?也许提出一个巧妙的解决方法?

SSCCE:

0 投票
6 回答
18424 浏览

wpf - 你如何解决这个 LostFocus/LostKeyboardFocus 问题?

好的,我有一个控件,它有一个 IsEditing 属性,为了参数,它有一个默认模板,通常是一个文本块,但是当 IsEditing 为真时,它会在文本框中交换以进行就地编辑。现在,当控件失去焦点时,如果它仍在编辑,它应该退出编辑模式并换回 TextBlock 模板。很直截了当,对吧?

想想在 Windows 资源管理器或桌面上重命名文件的行为(这与我所知道的相同......)这就是我们想要的行为。

问题是您不能使用 LostFocus 事件,因为当您切换到另一个窗口(或属于 FocusManager 的元素)时,LostFocus 不会触发,因为控件仍然具有逻辑焦点,因此无法正常工作。

如果您改用 LostKeyboardFocus,虽然这确实解决了“其他 FocusManager”问题,但现在您有了一个新问题:当您正在编辑并右键单击文本框以显示上下文菜单时,因为上下文菜单现在具有键盘焦点,您的控件失去键盘焦点,退出编辑模式并关闭上下文菜单,使用户感到困惑!

现在我尝试在菜单打开之前设置一个标志以忽略 LostKeyboardFocus,然后在 LostKeyboardFocus 事件中使用该标志来确定是否将其踢出编辑模式,但如果菜单打开并且我单击其他地方应用程序,由于控件本身不再具有键盘焦点(菜单有它),因此控件永远不会获得另一个 LostKeyboardFocus 事件,因此它仍处于编辑模式。(我可能必须在菜单关闭时添加一个检查以查看有焦点的内容,然后如果不是控件,则手动将其从 EditMode 中踢出。这似乎很有希望。)

所以......有人知道我如何成功地编码这种行为吗?

标记

0 投票
1 回答
2734 浏览

wpf - 如何强制键盘焦点在 DataGrid 上?

旧标题:GridView SelectCell + 焦点/编辑中的不一致操作(GridView 重新加载了两次?)

我正在开发一个在 Expander 的 Content 属性中设置的 GridView(由数据绑定)。当我打开扩展器时,我希望第三列,第一个元素被选中和编辑(但简单地聚焦也是可以接受的)。当我尝试将此功能添加到附加到扩展的此操作中时,网格从未为我选择第一个项目。我做了一些故障排除,奇怪的是,我注意到发生了一些事情。Expander 是 ItemsCollection 中模板的一部分,因此每次我向此 ItemsCollection 添加新项目时,都会在屏幕上创建一个 Expander(预设为 IsExpanded = false)。我为 Expander_Expanded 事件和 DataGrid.Loaded 事件设置了 Debug.WriteLine,以便让我知道事件何时发生。这是这两个事件的代码。

数据网格加载:

Expander.扩展:

当我创建一个包含 Expander 的项目并显示在屏幕上时,DataGrid.Loaded 事件会触发。第一次展开扩展器时,会触发 Expander.Expanded 事件以及 DataGrid.Loaded。此后每隔一次,只会触发 Expander.Expanded 事件。

第一次,[0][2] 处的单元格被聚焦并处于编辑模式。每隔一段时间,不会选择/聚焦任何单元格。如果 DataGrid.Loaded 事件中没有代码,则无论是否第一次打开 Expander,Cell 都不会被聚焦或处于编辑模式。Expander.Expanded 实际上似乎并没有做任何事情,选择明智的。作为记录,DataGrid 的绑定工作完美,无论我何时进行更改(无论是第一次打开 Expander 还是随后的任何时间),数据都会正确更新。谁能解释一下?

更新:

经过进一步调查,它与 GridLoaded 事件的关系不如与 Keyboard.Focus 的关系大。第一次加载 DataGrid 时,键盘焦点转到我要求的单元格(以文本框的形式)。但是,每次之后,键盘焦点仍然在打开 Expander 本身的 ToggleButton 上。尝试设置 Keyboard.Focus(dgCell) 或 Keyboard.Focus(dg) 似乎没有做任何事情,即使它们都是可聚焦的。我设法通过在打开 DataGrid 时点击“输入”按钮来验证这个假设。如果 DataGrid 具有键盘焦点,则 enter 将移动到下一行。如果 ToggleButton 具有焦点,它将折叠 Expander。

如前所述,第一次打开 Expander 时,DataGrid 具有键盘焦点,但每隔一次,焦点总是以按钮结束。有什么建议么?

0 投票
3 回答
9746 浏览

java - 检查是否按下了shift键

我正在编写一个应用程序,它应该在启动时检查是否按下了 shift 键。为此,我创建了一个负责此的小类:

但是,如果在应用程序启动时已经按下了 shift 键,这似乎不起作用。以下检查始终执行 else 情况。

如果在应用程序启动时已经按下了 shift 键,有没有办法检查它是否被按下?我知道使用 WinAPI 可以做到这一点,但我更喜欢 Javaish 的方式。

提前致谢!

0 投票
0 回答
339 浏览

wpf - 单击时,MainWindow 从浮动窗口中窃取键盘焦点

我在关注 WPF 时遇到了一些问题。尽管专注是一个常见问题,但我找不到适合我的问题的解决方案。情况如下:

我有一个编辑器软件,我可以在其中拖动文档浮动(如在 Visual Studio 中)。保存按钮显示在托管所有编辑器文档的窗格上方的主窗口中。现在我想做的是让一个窗口浮动,另一个窗口停靠在文档窗格中。当我想在主应用程序中按下保存按钮时,它会从我的浮动窗口中窃取焦点并自动将文档聚焦在文档窗格中,即使我直接单击按钮,单击也不会执行任何其他操作。

当有浮动窗口时,如何防止我的应用程序接收键盘焦点?因为我想将浮动窗口保留为我的活动窗口,但仍然可以访问保存按钮或主应用程序的菜单?

任何帮助将不胜感激!

0 投票
1 回答
2136 浏览

java - 如何在 Swing 中同步请求焦点?

当我调用时component.requestFocusInWindow(),Swing 将异步FOCUS_GAINEDFOCUS_LOST事件排入队列,而不是同步转移焦点。作为一种解决方法,似乎DefaultKeyboardFocusManager正在尝试通过延迟键盘事件的调度直到焦点事件完成调度来模拟同步切换焦点。但这似乎无法正常工作。

问题:有什么方法可以在 Swing 中同步改变焦点?真的是DefaultKeyboardFocusManager在尝试模拟同步焦点,是否存在严重错误?是否有正确执行此操作的焦点管理器?

动机:我有一个JTextField当它充满时会自动转移焦点的东西。在使用 编写集成测试java.awt.Robot时,我需要它的行为是确定性的,而不是依赖于时间的。

没有得到太多回应的相关问题:现在如何抓住焦点?

这是一个演示。预期行为:当您按住一个键时,每个键JTextField将包含一个字符。实际行为:焦点变化不够快,因此它们获得了多个字符。

更新:请注意,此行为并非特定于程序更改焦点。在第三个示例中,我取消了自定义焦点调用,而是简单地将文档更新延迟设置为 500 毫秒。然后我输入了1Tab2Tab3Tab4Tab5Tab6Tab7Tab8Tab9Tab0. 如您所见,数字已正确排队,但制表键被丢弃。

截屏 按住 1 个按钮后的屏幕截图 在此处输入图像描述

0 投票
1 回答
1196 浏览

c# - 如何以编程方式显示 FocusVisualStyle?

经过尝试,我可以看出 FocusVisualStyle 仅由键盘激活(选项卡和箭头键)。

尝试让 FocusVisualStyle 在组件加载后应用,这是不可能的,有一个简单的方法可以解决这个问题吗?

我发现了这一点:
-以编程方式导航焦点时焦点视觉未显示
- WPF 按钮如何决定显示 FocusVisualStyle?
- http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/99856840-f8ef-4547-9150-c4c46ec2f3df

但是没有一个明确的解决方案(不覆盖组件),我写不出来,有人可以帮忙吗?

0 投票
1 回答
1162 浏览

java - 使用外部类来处理条形码扫描仪输入?

我正在构建一个基本的销售点应用程序,并且一直在寻找让我的主 POS JFrame 监听条形码输入的方​​法。我发现了 Cyrusmith 发布的这段代码(稍作修改),看起来像我想要的,但我不知道如何在我的 JFrame 中实现它。看起来它打算成为一个单独的类,这就是我目前在我的项目中使用它的方式。我问了我的同事,他也不知道。

谢谢你的帮助。

0 投票
0 回答
70 浏览

java - 更快地最小化 JFrame,然后屏幕捕获程序被激活

我有当用户按任意键时需要最小化的程序。还有一件事需要通过按任何键来最小化程序,然后一些屏幕捕获软件捕获它(假设他仅通过键盘激活)。我做了第一部分。它会最小化每个键(包括 Prt Scr),但是当我使用 Lightshot 时,它首先会被 Lightshot 冻结,然后当我关闭它时,我的程序就会被最小化。是否可以比 Lightshot(或任何其他软件)激活它更快地最小化它?同样,假设这些软件只能通过按键盘来激活(因为我可以禁用手动激活它)。

这是我的测试课。