【问题标题】:How to show a JPopupMenu without stealing focus?如何在不窃取焦点的情况下显示 JPopupMenu?
【发布时间】:2015-08-01 00:37:12
【问题描述】:

我正在用 Java Swing 编写一个程序,在这个程序中会有一个搜索栏(这将是一个 JTextField),当在这个字段中输入一些内容时,我想直接在弹出菜单中显示搜索结果在搜索栏下方,就像谷歌一样。我没有实际用搜索结果填充菜单(我目前有一个带有固定项目的测试菜单),我被困在每次在字段中输入新字符时焦点都从字段中移开的问题上并且到弹出菜单。我正在使用

show(Component invoker, int x, int y)

显示菜单,调用者是文本字段或包含框。正如我所说,每次调用此函数时,弹出菜单都会将焦点从文本框上移开,这是一个大问题。而不是使用这种显示方法,我可以使用这些:

setLocation(int x, int y)
setVisible(boolean b)

但是,如果没有调用程序,弹出菜单不会相对于搜索栏显示,并且当我使用 setInvoker(Component invoker) 时,我遇到了与使用 show 方法相同的问题。我无法在初始化期间设置调用程序,因为调用程序不可见。那么如何在不将焦点从搜索文本字段中移开的情况下使用调用程序创建这个 popupMenu 呢?还是有更好的方法来完成我想要完成的事情?

【问题讨论】:

  • 焦点丢失的“主要原因”是因为弹出窗口中的某些东西正在窃取它。 AFAIK,JPopupMenu 不会自行改变焦点。考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个示例,它突出了您遇到的问题。这将减少混乱并获得更好的响应

标签: java swing jpopupmenu


【解决方案1】:

你试过requestFocusInWindow()吗?我认为您需要将焦点返回到弹出菜单代码末尾的搜索文本字段。我假设您有一些代码来创建弹出菜单。将searchTextField.requestFocusInWindow() 添加到此代码的末尾。如果这没有帮助,那么我需要更多信息。更多代码会有所帮助。

【讨论】:

  • 在 show/setInvoker 工作后立即执行 requestFocusInWindow()。谢谢!
【解决方案2】:
popup.setFocusable(false);

为我工作

【讨论】:

    猜你喜欢
    • 2015-06-12
    • 2011-01-08
    • 2020-10-30
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    相关资源
    最近更新 更多