【问题标题】:getFocusOwner with a custom class具有自定义类的 getFocusOwner
【发布时间】:2011-01-11 01:54:34
【问题描述】:

我在使用 getFocusOwner() 时需要帮助。我有一个用 Java 制作的数独游戏,我想在程序中添加箭头键导航。我做了一些研究,发现使用焦点系统是最好的方法(如果不是,请给我一个更好的方法,我可以研究一下)。

好的,因此出于测试目的,我正在尝试将焦点设置为 SetField,这是一个扩展 JTextField 的自定义类(自定义,因为我想禁用任何不是数字的输入)。它已设置为可聚焦。我在网格中间的 SetField 上调用 requestFocusInWindow(),并将焦点设置到该组件。当我尝试检索具有焦点的组件时出现问题。

这是我正在做的测试 getFocusOwner() 方法:

sGrid[40].requestFocusInWindow();

    try{
        System.out.println(this.getFocusOwner().getClass().getSimpleName());
    } catch(NullPointerException e){
        e.printStackTrace();
    }

无论我在什么组件上尝试这个,我总是得到空指针异常。我在我的程序中使用 JButtons、JLabels 甚至 JPanel 进行了尝试。焦点设置在组件上。我可以看到插入符号在预期的 SetField 中闪烁。有什么我做错了吗?提前感谢您的帮助。

【问题讨论】:

    标签: java swing focus jtextfield


    【解决方案1】:
    1. 我们不是只允许数字的自定义组件,而是一个 JFormattedTextField。
    2. 您甚至需要确定哪个组件具有焦点,为什么不添加一个 KeyListener、MouseListener?我不太确定你用焦点在做什么,但这看起来很奇怪。

    【讨论】:

    • 我所做的只是通过打印出它返回的组件的简单名称来测试 getFocusOwner 方法。我想我必须得到哪个组件有焦点,这样我才能弄清楚按下箭头键后焦点会转到哪里。我将研究 JFormattedTextField。反正我目前的解决方案效果不太好。
    【解决方案2】:

    我想在程序中添加箭头键导航。

    您应该使用Key Bindings。创建一个基本的“ChangeFocusAction”。您将需要 4 个此类的实例,您可以将其映射到 KeyStroke。

    假设您有一个包含 81 个文本字段的数组,您的 Action 可以使用一个整数值创建,该整数值告诉 Action 如何更改焦点。例如:

    右 = -1
    左 = 1
    向上 = -9
    向下 = 9

    ActionEvent 的源将包含具有焦点的文本字段。然后搜索数组以找到该文本字段的偏移量。然后将上面的 int 值添加到索引并请求关注该组件。

    【讨论】:

    • 这正是我想要做的,但我需要先获得有焦点的组件对吧?
    • 我就是这么说的。 ActionEvent 有源组件。
    【解决方案3】:

    刚刚发现问题。对于遇到此问题的其他任何人,请尝试使用 (Window).getMostRecentFocusOwner()。这对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 2014-01-12
      • 2014-06-02
      相关资源
      最近更新 更多