4

我需要帮助工作 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 中闪烁。有什么我做错了吗?提前感谢您的帮助。

4

3 回答 3

1
  1. 而不是一个只允许数字的自定义组件,只是我们一个 JFormattedTextField。
  2. 你甚至需要确定哪个组件有焦点,为什么不添加一个KeyListener,MouseListener?我不确定你用焦点做什么,但这似乎很奇怪。
于 2011-01-11T02:02:34.233 回答
1

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

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

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

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

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

于 2011-01-11T02:20:46.100 回答
1

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

于 2011-01-11T03:09:05.170 回答