Swing中如何让一个TextField获得焦点 比如说做一个像QQ那样的登陆框,如何让焦点设置在用户名上 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 new JTextField().setFocusable(true); 百度老师,谷歌老师,JDK文档老师 就是grabFocus(),二楼是不对的。请帖完整代码。 new JTextField().setFocusable(true);这样应该可以的。 //是输入焦点吧 JTextField jtf = new JTextField();jtf.requestFocus();requestFocuspublic void requestFocus()请求此 Component 获取输入焦点,并且此 Component 的顶层祖先成为获得焦点的 Window。此 Component 对于所要许可的请求而言必须是不可显示的、可聚焦的和可见的并且其所有祖先(除了顶层 Window 以外)必须是可见的。此方法会尽力完成该请求;但是在某些情况下可能无法完成。在此 Component 接收 FOCUS_GAINED 事件前,开发人员永远不能假定此 Component 是焦点所有者。如果由于此 Component 的顶层 Window 没有成为获得焦点的窗口而拒绝了此请求,则记住此请求,并在后来用户使窗口成为获得焦点的窗口时许可此请求。 此方法不能用于为根本不是 Component 的内容设置焦点所有者,应该使用 KeyboardFocusManager.clearGlobalFocusOwner()。 因为此方法的焦点行为与平台有关,所以强烈建议开发人员在可能时使用 requestFocusInWindow。 注:并不是所有的焦点传输都将导致防止调用此方法。同样地,组件可以在没有调用此方法或 Component 的其他任何方法的情况下接收焦点。 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中运行的. //.....................代码片段。。 this.add(jbLogin); this.add(jbExit); //将设定焦点的语句放在界面不在变化的地方 一般放在比较后面最好// jtUsername.setFocusable(true); // 这个是绝对不行的因为是able吗 是使得能够获得焦点// jtUsername.grabFocus(); // 这个可行 jtUsername.requestFocus(true); // 这个可行 this.repaint(); } 用楼主的代码测试了多次,就像上面代码所示的这样就能获取焦点。或者是楼主代码不全,有一个重绘线程实现IP和端口的动态刷新,那么最好的办法是在你的线程重绘结束后在通过引用获取一次焦点。其他的想不出什么了,也许是IDE的问题,反正抛开线程重绘的情况上面的代码肯定是每次都能获取焦点的。 最好放在swing的线程做这种界面绘制,避免获取不到的情况。final JTextField name = new JTextField();SwingUtilities.invokeLater(new Runnable(){ public void run() { name.requestFocusInWindow(); }}); 用什么集合比较好 java执行sql server的select count的效率,怎么样写,效率最高? 接口修饰符 请问这个问题如何解决 圆packing 和np java怎么调用jni获取已安装软件的列表信息? 关闭窗口的程序怎样写啊?我怎么关不了 Socket通信流问题 请教sqlserver驱动用法 jdk1.4是否包含了jet的功能?还是有jet1.4下?哪有下? ^小女子问个同步的问题$ 有关字符串显示格式的问题帮回答下 谢谢
这样应该可以的。
//是输入焦点吧
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 的
其他任何方法的情况下接收焦点。
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中运行的.
//.....................代码片段。。
this.add(jbLogin);
this.add(jbExit);
//将设定焦点的语句放在界面不在变化的地方 一般放在比较后面最好
// jtUsername.setFocusable(true); // 这个是绝对不行的因为是able吗 是使得能够获得焦点
// jtUsername.grabFocus(); // 这个可行
jtUsername.requestFocus(true); // 这个可行
this.repaint();
}
或者是楼主代码不全,有一个重绘线程实现IP和端口的动态刷新,那么最好的办法是在你的线程重绘结束后在通过引用获取一次焦点。
其他的想不出什么了,也许是IDE的问题,反正抛开线程重绘的情况上面的代码肯定是每次都能获取焦点的。
SwingUtilities.invokeLater(new Runnable(){
public void run() {
name.requestFocusInWindow();
}
});