【问题标题】:FocusLost called after menuaction在 menuaction 之后调用 FocusLost
【发布时间】:2011-12-01 18:07:35
【问题描述】:

我有一个带有快捷键的 MenuItem 来保存 JTextFied 临时的数据并打印出来

保存函数在 JTextField 的 FocusLost 事件上调用,打印通过 MenuItems actionListener 调用,当我单击 MenuItem 以及按下菜单项的快捷键时触发(例如:f1)

问题是,当我直接按 f1(菜单项的快捷方式)时,Textfied 的 focusLost 事件仅在菜单项执行完操作后才会触发,而当我进入菜单并按下时,会首先触发 focuslost然后是菜单的Action

有没有办法强制 Focuslost,即使使用快捷键,也可以先触发 focusLost 事件

尝试使用 requesfocusinWindow、setText(在其他演示文本字段上执行只是为了强制焦点丢失)

【问题讨论】:

  • 听起来你的设置有问题 - 是时候让 sscce 准确了解你在做什么了

标签: java swing


【解决方案1】:

1)我认为这在编程语言中是不可能的,更多关于AWT Focus SubsystemHow to Use the Focus Subsystem的理论,

2) 你必须将这个保存进程重定向到背景任务,在此之前你可以检查JMenu 和它的JMenuItem 是否被选中,这个检查只使用ButtonModel,否则不要不要那样做,因为你的 GUI 必须等待这个进程

3) 另一种选择是保存从JComponents 到一些Array 的定期基础值,在那里您可以检查值是否已更改,所有更改都必须从背景任务中检查/保存,对摇摆界面

4) 创建 Timer 的最简单方法是将一些逻辑包装到 Runnable#Thread,延迟 Thread.sleep(int) 但仅限于 Runnable#Thread

【讨论】:

    【解决方案2】:

    当您想要“强制”focusLost 时,通常会受到怀疑,因为该事件的目的是用户做了一些事情来改变应用程序的焦点状态。当您说 F1 是菜单项快捷方式时,您的意思是它是选择菜单时执行的相同代码的快捷方式,还是您将其设置为菜单助记符?

    最后,快捷键通常不会在本质上改变焦点,而单击菜单项所需的鼠标操作会改变焦点,这可能需要您自己考虑。

    【讨论】:

    • 是的,它是选择菜单时执行的相同代码的快捷方式
    • 那么我认为在这种情况下您将不得不自己考虑 focusLost 中的逻辑-它对您起作用的是鼠标事件,因为用户在单击时触发它,但是当他们只是使用按键没有焦点变化。
    猜你喜欢
    • 2018-06-07
    • 2013-05-14
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多