比如说做一个像QQ那样的登陆框,如何让焦点设置在用户名上

解决方案 »

  1.   

    new JTextField().setFocusable(true);
      

  2.   

    百度老师,谷歌老师,JDK文档老师
      

  3.   

    就是grabFocus(),二楼是不对的。请帖完整代码。
      

  4.   

    new JTextField().setFocusable(true);
    这样应该可以的。
      

  5.   


    //是输入焦点吧 
    JTextField jtf = new JTextField();
    jtf.requestFocus();requestFocus
    public void requestFocus()请求此 Component 获取输入焦点,并且此 Component 的顶层祖先成为获
    得焦点的 Window。此 Component 对于所要许可的请求而言必须是不可显示的、可聚焦的和可见的并且其所
    有祖先(除了顶层 Window 以外)必须是可见的。此方法会尽力完成该请求;但是在某些情况下可能无法完
    成。在此 Component 接收 FOCUS_GAINED 事件前,开发人员永远不能假定此 Component 是焦点所有者。如果由于此 Component 的顶层 Window 没有成为获得焦点的窗口而拒绝了此请求,则记住此请求,并在后来
    用户使窗口成为获得焦点的窗口时许可此请求。 
    此方法不能用于为根本不是 Component 的内容设置焦点所有者,应该使用 
    KeyboardFocusManager.clearGlobalFocusOwner()。 因为此方法的焦点行为与平台有关,所以强烈建议开发人员在可能时使用 requestFocusInWindow。 注:并不是所有的焦点传输都将导致防止调用此方法。同样地,组件可以在没有调用此方法或 Component 的
    其他任何方法的情况下接收焦点。 
      

  6.   


    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class LoginFrame extends JFrame implements Protocol{
    //定义标签
    JLabel jlIP=new JLabel("IP地址:");
    JLabel jlUsername=new JLabel("用户名:");
    JLabel jlPort =new JLabel("端口号:");
    //定义文本框。
    JTextField jtIP=new JTextField(DEF_IP);
    JTextField jtUsername=new JTextField();
    JTextField jtPort =new JTextField(DEF_PORT);
    //定义按钮。
    JButton jbLogin=new JButton("登录");
    JButton jbExit=new JButton("退出");
    public LoginFrame(){
    //设置框架的属性。
    this.setVisible(true);
    this.setResizable(false);
    this.setBounds(300,200,300,200);
    this.setTitle("用户登录");
    this.setLayout(null);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //设置标签的属性。
    jlUsername.setBounds(30,30,60,20);
    jlIP.setBounds(30,60,60,20);
    jlPort.setBounds(30,90,60,20);
    //设置文本框的属性。
    jtUsername.setBounds(150,30,80,20);
                    /*
                    下面这几种方法都试了,有时能成功,但有时不成功,我是在JCreator中运行的,不知原因?
                    */
    //jtUsername.setFocusable(true);
    //jtUsername.requestFocus(true);
    //jtUsername.grabFocus();
    jtIP.setBounds(150,60,80,20);
    jtPort.setBounds(150,90,80,20);
    //设置按钮属性。
    jbLogin.setBounds(50,130,80,30);
    jbExit.setBounds(160,130,80,30);

    this.add(jlUsername);
    this.add(jlIP);
    this.add(jlPort);
    this.add(jtUsername);
    this.add(jtIP);
    this.add(jtPort);
    this.add(jbLogin);
    this.add(jbExit);

    this.repaint();
    }
    public static void main(String args[]){
    LoginFrame lf=new LoginFrame();
    }
    }楼上的几种方法都试了,有时能成功,但有时却是不成功的,我是在JCreator中运行的.
      

  7.   


    //.....................代码片段。。
            this.add(jbLogin);
            this.add(jbExit);
            
            //将设定焦点的语句放在界面不在变化的地方 一般放在比较后面最好
    //        jtUsername.setFocusable(true); // 这个是绝对不行的因为是able吗 是使得能够获得焦点
    //        jtUsername.grabFocus();        // 这个可行
             jtUsername.requestFocus(true);  // 这个可行
            this.repaint();
        }
      

  8.   

    用楼主的代码测试了多次,就像上面代码所示的这样就能获取焦点。
    或者是楼主代码不全,有一个重绘线程实现IP和端口的动态刷新,那么最好的办法是在你的线程重绘结束后在通过引用获取一次焦点。
    其他的想不出什么了,也许是IDE的问题,反正抛开线程重绘的情况上面的代码肯定是每次都能获取焦点的。
      

  9.   

    最好放在swing的线程做这种界面绘制,避免获取不到的情况。final JTextField name = new JTextField();
    SwingUtilities.invokeLater(new Runnable(){
    public void run() {
    name.requestFocusInWindow();
    }
    });