getFocusOwner带有自定义类

时间:2011-01-11 01:54:35

标签: java swing focus jtextfield

我需要帮助工作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,甚至是我程序中的JPanels。然而,焦点设置为组件。我可以看到插入符号在预期的SetField中闪烁。有什么我做错了吗?提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

  1. 而不是仅允许数字的自定义组件,只需使用JFormattedTextField。
  2. 您是否需要确定哪个组件具有焦点,为什么不添加KeyListener,MouseListener?我不完全确定你在关注焦点但是看起来很奇怪。

答案 1 :(得分:1)

  

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

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

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

对= -1
左= 1
up = -9
down = 9

ActionEvent的源代码将包含具有焦点的文本字段。然后搜索arry以查找该文本字段的偏移量。然后将上面的int值添加到索引中,并将请求焦点放在该组件上。

答案 2 :(得分:1)

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