【问题标题】:Why does my component not get focus?为什么我的组件没有获得焦点?
【发布时间】:2012-06-18 05:46:54
【问题描述】:

我正在运行一个小程序,并试图专注于 init 方法之外的组件。我尝试过使用 requestFocus 和 requestFocusInWindow。这两个都返回 true,isDisplayable、isVisible 和 isFocusable 也是如此,但在此之后立即调用 hasFocus 会返回 false。该组件只是没有显示在小程序中。

这里是事件监听器调用的方法(当用户点击“开始战斗”时),试图关注组件:

private void beginBattle(){
    BattleSequence bs = new BattleSequence(..);
    remove(pnlInit);
    remove(pnlOOB);
    remove(pnlBattle);
    add(bs);
    bs.setVisible(true);
    bs.requestFocusInWindow(); //this returns 'true'
    bs.setBounds(0, 0, bs.getSize().width, bs.getSize().height);
    bs.init();
    }

public class BattleSequence extends RavelSequence

public abstract class RavelSequence extends Applet implements KeyListener, FocusListener

为什么焦点请求被拒绝?如果有更多相关的代码,我可以发布它!

***编辑: 添加鼠标侦听器可以使组件获得焦点,但我不希望用户需要鼠标来控制游戏。我更改了 RavelSequence 的声明以扩展 Container 而不是 Applet,一切正常。
bs.hasFocus 仍然返回 false,但关键事件得到了适当的处理。

【问题讨论】:

  • BattleSequence 是一个什么样的组件?
  • 它扩展了一个扩展Applet的抽象类。公共类 BattleSequence 扩展 RavelSequence 公共抽象类 RavelSequence 扩展 Applet 实现 KeyListener、FocusListener

标签: java focus


【解决方案1】:

尝试在事件调度线程上调用它。

【讨论】:

  • 我是否可以通过将 beginBattle 方法放入 actionPerformed 方法而不是现在的位置来做到这一点?
  • 试试 EventQueue.invokeLater(new Runnable() { @Override public void run() { bs.requestFocusInWindow(); } });
  • 好的,这也可以,而且比添加鼠标监听器要古怪一些。谢谢!
【解决方案2】:

尝试将 MouseListener 添加到相关组件,并在 mouseClicked() 方法中请求焦点。

【讨论】:

  • 好的,这很有效,并且可以将焦点转移到 BattleSequence。还有其他方法吗?整个程序是面向键盘的,如果可能的话,我想把鼠标放在外面。另外,为什么会这样?
  • 另外,它不适用于第一次点击,但它适用于第二次点击。有人可以解释这是为什么吗?
猜你喜欢
  • 1970-01-01
  • 2019-08-15
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多