将焦点设置为文本字段

时间:2011-01-09 16:01:08

标签: java swing netbeans focus

我有一个用netbeans开发的应用程序,我想在显示一个面板时将焦点设置为某个jTextField。我已经阅读了一些帖子,并尝试了各种方法,但没有工作。其中一个主要问题是放置所需代码的位置,我相信我的情况是this.txtMessage.requestFocusInWindow();

有一些帖子表明使用了Window Listener,但是由于netbeans已经生成了GUI,我无法看到如何实现接口,因为我无法编辑创建jPANEL等的代码。整件事非常令人沮丧,我真的不相信这应该是那么困难。

正如测试一样,我将requestFocusInWindow();添加到面板上的按钮,它确实将焦点设置为所需的输入。

9 个答案:

答案 0 :(得分:17)

我有一个类似的场景,我需要在显示面板时将焦点设置在面板内的文本框中。面板在应用程序启动时加载,因此我无法在构造函数中设置焦点。由于面板没有被加载或被关注显示,这意味着我没有事件来发起焦点请求。

为了解决这个问题,我在main中添加了一个全局方法,该方法在面板中调用了一个在文本区域调用requestFocusInWindow()的方法。我将调用显示在面板上的全局方法,调用show之后。这意味着将显示面板,然后在显示面板后指定焦点的文本区域。希望有意义并有所帮助!

此外,您可以通过在设计视图中右键单击对象并选择自定义代码来编辑大多数自动生成的代码,但我认为它不允许您编辑面板。

答案 1 :(得分:11)

我不确定我是否在这里遗漏了一些东西,但是没有理由不能为你的面板添加一个监听器。

在Netbeans中,只需点击编辑器窗口左上角的“Source”按钮,即可编辑大部分代码。实际的布局代码大多是锁定的,但如果需要,您甚至可以自定义。

据我所知,txtMessage.requestFocusInWindow()应该设置第一次显示窗口时的默认焦点。如果您想在窗口显示后请求焦点,则应使用txtMessage.requestFocus()

对于测试,您只需在构造函数中添加一个侦听器:

addWindowListener(new WindowAdapter(){ 
  public void windowOpened( WindowEvent e){ 
    txtMessage.requestFocus();
  } 
}); 

答案 2 :(得分:5)

在JFrame或JDialog中,你总是可以覆盖setVisible()方法,它运行良好。我没有尝试过JPanel,但可以作为替代方案。

@Override
public void setVisible(boolean value) {
    super.setVisible(value);
    control.requestFocusInWindow();
}

答案 3 :(得分:2)

我永远玩弄了这件事,终于找到了似乎永远有用的东西!

    textField = new JTextField() {

        public void addNotify() {
            super.addNotify();
            requestFocus();
        }
    };

答案 4 :(得分:2)

我是通过在textField上设置AncesterAdded事件并在窗口中设置请求焦点来实现的。

答案 5 :(得分:1)

对我来说,最简单的方法是将component.requestFocus();行放在框架或面板构造函数底部的setVisible(true);行之后。

这可能与在创建所有组件后要求焦点有关,因为在请求焦点请求后创建新组件会使您的组件松散焦点,并将焦点转移到您的新创建的组件。 至少,这就是我的假设。

答案 6 :(得分:1)

以上都不适合我,因为我的窗口是JPopupMenu

这是什么工作:

addAncestorListener(new AncestorListener() {
    @Override
    public void ancestorAdded(AncestorEvent ae) {
        myEdit.requestFocus();
    }

    // ... other ancestor listener methods
}

答案 7 :(得分:1)

如果使用 Netbeans 创建 GUI ,您还可以插入一些自编代码。只需选择一个元素(可能是按钮,面板或窗口),然后使用“属性” - “对话框”中的“代码”选项卡。

在那里,您可以为创建过程的各个部分插入 Pre - Post - 代码。

我认为窗口的“After-All-Set-Code”字段是您的代码的好地方,或者您可以将其绑定到事件(“Properties”-dialog - &gt;“Events”)“< strong> componentShown “文本字段/面板。

答案 8 :(得分:-2)

这很简单:

textField.setFocus();