日期:2014-05-20  浏览次数:20692 次

在JDialog里边设置JTextField焦点问题,大家帮忙想想,问题解决立刻结帖
要求是这样的
1:JDialog上面有一个JTabbedPane
2:JTabbedPane上有一个JPanel
3:JPanel上有两个JTextField
我需要把焦点设置在第一个JTextField上面
JDialog是默态的

代码如下:
import   java.awt.BorderLayout;
import   javax.swing.JComponent;
import   javax.swing.JDialog;
import   javax.swing.JPanel;
import   javax.swing.JScrollPane;
import   javax.swing.JTabbedPane;
import   javax.swing.JTextField;

public   class   Mytest   extends   JDialog{
       
        private   JPanel   contentPanel   =   new   JPanel();
        private   JTabbedPane   tabd   =   null;
        public   JTextField   x[]   =   new   JTextField[2];
public   Mytest(){
                this.setModal(true);   //这一句话是不能改的
                tabd   =   new   JTabbedPane();
                x[0]   =   new   JTextField();
                x[1]   =   new   JTextField();
               
                contentPanel.setLayout(new   BorderLayout());
                contentPanel.add(x[0],BorderLayout.NORTH);
                contentPanel.add(x[1],BorderLayout.SOUTH);
                tabd.add(contentPanel);
                this.setSize(200,500);
                this.getContentPane().add(tabd);
               
        }

public   static   void   main(String[]   args)   {
        Mytest   frame   =   new   Mytest();

        frame.show();

}
}

------解决方案--------------------
contentPanel.add(x[0],BorderLayout.NORTH);
contentPanel.add(x[1],BorderLayout.SOUTH);
tabd.add(contentPanel);
this.setSize(200,500);
this.getContentPane().add(tabd);

这里加个x[0].requestFocus()试试

}

------解决方案--------------------
requestFocus()
------解决方案--------------------
requestFocusInWindow
protected boolean requestFocusInWindow(boolean temporary)如果此 Component 的顶层祖先已经是获得焦点的 Window,则请求此 Component 获得输入焦点。此组件对于所要许可的请求而言必须是可显示的、可见的和可获得焦点的。此方法会尽力完成该请求;但是在某些情况下可能无法完成。在此 Component 接收 FOCUS_GAINED 事件前,开发人员必须永远不能假定此 Component 是焦点所有者。
此方法返回布尔值。如果返回 false,则请求注定要失败。如果返回 true,并且在本机窗口系统允许请求前不禁止该请求或不发生特别的事件(如处理该组件的同位体),则请求成功。此外,虽然返回 true 表示请求可能成功了,但是在此组件接收 FOCUS_GAINED 事件前,开发人员必须永远不能假定此 Component 是焦点所有者。

此方法不能用于为根本不是 Component 的内容设置焦点所有者。应该使用 KeyboardFocusManager.clearGlobalFocusOwner。

可在各种平台之间一致地实现此方法的焦点行为,所以强烈要求开发人员在可能时使用此方法,而不是 requestFocus。依赖 requestFocus 的代码可能在不同平台上表现出不同的焦点行为。

此方法会尽力完成该请求,确保作为此请求结果所产生的 FocusEvent 具有指定的临时值。但是,因为在所有本机窗口系统上指定一个任意的临时状态是不可能实现的,所以只有轻量组件可以保证此方法的行为正确。此方法并非用于一般用途,而是作为轻量组件库(如 Swing)的挂钩而存在的。


参数:
temporary - 如果焦点改变是临时的(如窗口丢失焦点),则为 true;有关临时焦点改变的更多信息,请参阅 Focus Specification