首先,建立一个swing界面。依然模仿QQ登录界面建立。
javax.swing.JFrame jf = new javax.swing.JFrame();
jf.setSize(555, 420) ; //界面大小宽555,高420
jf.setTitle("QQ2018正式版");
jf.setDefaultCloseOperation(3); //退出时可以关闭进程
jf.setLocationRelativeTo(null); //居中显示
java.awt.FlowLayout flow = new java.awt.FlowLayout(); //采用流式布局
jf.setLayout(flow);
javax.swing.ImageIcon icon = new javax.swing.ImageIcon("C:\\Users\\mayifan\\Desktop\\1.jpg"); //添加图片和标签并设置大小
javax.swing.JLabel jla = new javax.swing.JLabel(icon);
java.awt.Dimension dn = new java.awt.Dimension(550, 120);
jla.setPreferredSize(dn);
jf.add(jla);
javax.swing.JLabel la_name1 = new javax.swing.JLabel(" ");
jf.add(la_name1);
javax.swing.JLabel la_name2 = new javax.swing.JLabel("账号");
jf.add(la_name2);
javax.swing.JTextField jft = new javax.swing.JTextField();
java.awt.Dimension dm = new java.awt.Dimension(340, 50);
jft.setPreferredSize(dm);
jf.add(jft);
javax.swing.JLabel la_name3 = new javax.swing.JLabel(" ");//我在这里陆续添加了一些空格,它的作用是弥补流式布局布局死板的缺点,使得相应的有内容的部分可以摆放在我想要放的位置。空格的数量可以调整。
jf.add(la_name3);
javax.swing.JLabel la_name4 = new javax.swing.JLabel(" ");
jf.add(la_name4);
javax.swing.JLabel la_name5 = new javax.swing.JLabel("密码");
jf.add(la_name5);
javax.swing.JPasswordField jft1 = new javax.swing.JPasswordField(30); //最初采用的是文本框JTextField,但密码还是以加密形式呈现更加合适,改为采用JPasswordField
java.awt.Dimension dz = new java.awt.Dimension(340, 50);
jft1.setPreferredSize(dz);
jf.add(jft1);
javax.swing.JLabel la_name6 = new javax.swing.JLabel(" ");
jf.add(la_name6);
javax.swing.JLabel la_name7 = new javax.swing.JLabel(" ");
jf.add(la_name7);
javax.swing.JCheckBox jcb = new javax.swing.JCheckBox("自动登录");
jf.add(jcb);
javax.swing.JCheckBox jcb1 = new javax.swing.JCheckBox("记住密码");
jf.add(jcb1);
javax.swing.JLabel la_name = new javax.swing.JLabel(" 找回密码 ");
jf.add(la_name);
javax.swing.JLabel la_name8 = new javax.swing.JLabel("");
jf.add(la_name8);
javax.swing.JLabel la_name9 = new javax.swing.JLabel(" ");
jf.add(la_name9);
javax.swing.JButton jbu = new javax.swing.JButton("登陆");
java.awt.Dimension dq = new java.awt.Dimension(300, 50);
jbu.setPreferredSize(dq);
jf.add(jbu);
javax.swing.JLabel la_name10 = new javax.swing.JLabel("");
jf.add(la_name10);
javax.swing.JLabel la_name11 = new javax.swing.JLabel(
"注册账号 ");
jf.add(la_name11);
这里的布局尽量按照QQ的登录界面来设置了。表面上好像组件齐全,但它们还没有灵魂,没法和用户实现交互功能,我希望它能实现当我输入正确的账号和密码之后能够顺利登陆,并弹出登陆界面。于是,添加监听器。
/ 事件监听器的添加要注意三个部分,他们是事件源,监听器方法,绑定事件处理类。
新建一个监听器的类。
public class Butlistener implements ActionListener
{
public String account;
public String password;
private JTextField jt;
private JPasswordField jt1;
private Login lo;
private javax.swing.JFrame jf;
public void setjt(JTextField jft)//传对象
{
jt=jft;
}
public void setjt1(JPasswordField jft1)
{
jt1=jft1;
}
public void setjt2(Login lo)
{
this.lo=lo;
}
public void setjt3(javax.swing.JFrame jf)
{
this.jf=jf;
}
public void actionPerformed(ActionEvent e)
{
password= String.valueOf(this.jt1.getPassword());
account=jt.getText();
if(password.equals("123456")&&account.equals("792380497"))
{
System.out.println("密码输入正确 ");
jf.setVisible(false);
lo.showUI1();
new Thread(new Runnable() {
public void run(){
while(true){
try {
Thread.sleep(5000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.exit(0);
}
}
}).start();
}
else
System.out.println("密码错误,请重新输入");
}
}
我在这段程序里创建了很多方法,多次用到传对象的方法,为什么呢?因为监听器和界面在两个类中,我要为界面中的按钮添加动作监听器,必然需要在监听器里通过界面的对象来调用方法获取密码框的值,那么我们需要把对象从界面这个类传递到监听器中,在监听器中获取数据来进去判断,再得到相应的输出。
Butlistener but = new Butlistener();
jbu.addActionListener(but);
jf.setVisible(true);
but.setjt(jft);
but.setjt1(jft1);
but.setjt2(this);
but.setjt3(jf);
在写这段代码的时候我有两大收获。一个是我之前写的时候两次创建了Butlistener的对象,然后在跑程序时候发现有“空指针”的提示,当我删去一个对象,并把他们都通过but来传递时,发现程序可以正常运行。故总结,我们不能对一个类使用多个对象,会使程序出错。另一个问题是我在监听器这个类中定义了一个相同类型的对象来接收,我发现,其实可以建一个同名的对象,只有在传对象赋值的时候用“this.”就可以了,可以说明它是这个类中的对象。
监听器的思路很简单,就是当按下按钮时,让监听器来判断账号密码是不是匹配,如果匹配,则跳出登陆成功界面。
public void actionPerformed(ActionEvent e)
{
password= String.valueOf(this.jt1.getPassword());
account=jt.getText();
if(password.equals("123456")&&account.equals("792380497"))
{
System.out.println("密码输入正确 ");
jf.setVisible(false);
lo.showUI1();
new Thread(new Runnable() {
public void run(){
while(true){
try {
Thread.sleep(5000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.exit(0);
}
}
}).start();
}
else
System.out.println("密码错误,请重新输入");
}
showUI1();是我建立的一个方法,在里面写了弹出界面。这个界面很简单,就不把代码列出来了。
因为要把弹出的界面在出现几秒后关闭,我这里用到了睡眠的方法,添加了一个新的线程(如果不添加新的线程弹出框不能正常显示,因为sleep使程序暂停,影响了显示)。
最后的结果如下: