用Java实现登录窗口并进行随机数排序


前言

Java程序设计这就讲完了?完全没感觉嘛,这才刚对面向对象编程熟悉一点点,就要准备期末考试了。

好多小伙伴都很担心这次的期末,考核的内容大概就是写一个登录程序(可视化窗口)并在一个窗口上面实现一个简单算法(以往都是直接在控制台输入输出的,这次就要把自己创建的窗口当作控制台来用)。登录程序课本上都有代码的,问题不大;简单算法无非是生成几个随机数、冒泡/选择排序、二分查找啥的,只不过实现的时候要在自己创建的窗口上实现。

我也是为了不挂科哈,找到了19级的学长学姐,了解到去年考的内容是登录程序加一个随机数排序,就想着上手练一练试一试,结果真就成了,花费了大概一整天时间,因为想着把这两项工作实现为一个程序,到最后还是有个小bug改不了,那就皮一下吧,哈哈,反正是做着玩儿的。

关于类名,在这里说明:延续课本上“J”加一个数字的命名方法。不同的是,“J”后面第一个数字表示程序运行时当前窗口的出现次序;第二个数字表示实现该窗口所需程序个数(可能一个窗口中有好多面板好多组件想要一次放下不好操作,例如课本上的J10、J11和J12关系)。


J1*

第一个窗口完成就是这个样子,看完课本基本都可以实现:
在这里插入图片描述

J10

先是一个初始窗口,当作一个基本容器使用:
在这里插入图片描述
代码如下:

import javax.swing.*;

public class J10 extends JFrame {

	J10() {
		setTitle("登录窗口");
		setSize(500, 300);
		setVisible(true);
	}
	
	public static void main(String[] args) {new J10();}

}

J11 extends J10

按照课本思路创建账号和密码:
在这里插入图片描述
代码如下:

import java.awt.*;
import javax.swing.*;

public class J11 extends J10 {
	
	J11() {
		//设置布局,创建面板
		setLayout(new GridLayout(2, 1));
		JPanel p1 = new JPanel();
		JPanel p2 = new JPanel();
		
		//创建各组件
		JLabel l1 = new JLabel("账号:");
		JLabel l2 = new JLabel("密码:");
		JTextField t = new JTextField(16);
		JPasswordField p = new JPasswordField(16);	
		
		//将各组件添加到面板上,将面板添加到窗口
		p1.add(l1); p1.add(t);
		p2.add(l2); p2.add(p);
		add(p1); add(p2);
		
		//设置提示
		t.setToolTipText("账号最长16位");
		p.setToolTipText("密码最长16位");
	}
	
	public static void main(String[] args) {J11 lg = new J11(); lg.setVisible(true);}

}

同样是课本里的程序,不过main函数里面的J11 lg = new J11(); lg.setVisible(true);可以简化写成new J11().setVisible(true);这样的匿名形式,后面我就直接写成第二种写法啦,所有在这里说明一下。

J12 extends J11

接着加上登录和注册按钮:
在这里插入图片描述
代码如下:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class J12 extends J11 implements ActionListener {
	
	JButton b1, b2;
	
	J12() {
		//创建布局管理器和面板
		setLayout(new GridLayout(3, 1));
		JPanel p = new JPanel();
		
		//创建按钮并添加监听器
		b1 = new JButton("登录");
		b2 = new JButton("注册");
		b1.addActionListener(this);
		b2.addActionListener(this);
		
		//添加组件和面板到对应位置
		p.add(b1); p.add(b2);
		add(p);
	}
	
	//实现ActionListener接口抽象方法来完成具体事件
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();
		if (obj == b2) {  //如果鼠标点击了“注册”按钮
			new J21();  //新打开一个J21窗口
			this.setVisible(false);  //把本窗口设置为不可见
		}
	}

	public static void main(String[] args) {new J12().setVisible(true);}

}

那啥?QQ登录界面不是在输入账号密码点击登录后自动关掉嘛,其实就是用setVisible()方法把自己设置为了不可见(这一点老师上课也提到过),如果想直接关掉的话,可以调用方法System.exit(0)不过需要注意的是,这样做会关闭所有程序(这个项目里的所有程序),是真正意义上的退出。

J21 extends J10

第二个窗口:
在这里插入图片描述
代码如下:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class J21 extends J10 implements ActionListener {
	
	JButton b;
	
	J21() {
		//设置网格布局管理器和4个面板
		setLayout(new GridLayout(4, 1));
		JPanel p1 = new JPanel();
		JPanel p2 = new JPanel();
		JPanel p3 = new JPanel();
		JPanel p4 = new JPanel();
		
		//创建按钮并注册监听器
		b = new JButton("注册并登录");
		b.addActionListener(this);
		
		//三个标签
		JLabel l1 = new JLabel("申请账号:");
		JLabel l2 = new JLabel("输入密码:");
		JLabel l3 = new JLabel("确认密码:");
		
		//一个文本框两个密码框
		JTextField t = new JTextField(16);
		JPasswordField pass1 = new JPasswordField(16);
		JPasswordField pass2 = new JPasswordField(16);
		
		//有一个好习惯是先依次进行各个面板种的组件添加,然后再把各面板添加到窗口上
		p1.add(l1); p1.add(t);
		p2.add(l2); p2.add(pass1);
		p3.add(l3); p3.add(pass2);
		p4.add(b);
		
		add(p1); add(p2); add(p3); add(p4);
		
		//设置提示,可有可无
		t.setToolTipText("账号最长16位");
		pass1.setToolTipText("密码最长16位");
		pass2.setToolTipText("密码最长16位");
	}
	
	//实现ActionListener接口抽象方法来完成具体事件
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();
		if (obj == b) {
			this.setVisible(false);
			//System.exit(0);  //直接退出(完全结束程序)
			new J31();
		}
	}

	public static void main(String[] args) {new J21().setVisible(true);}
	
}

J31 extends J10

第三个窗口:
在这里插入图片描述

代码如下:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class J31 extends J10 implements ActionListener {
	//设置静态变量,这样就可以与其他类共享使用(前提是都要在同一个包里)
	static JButton b;
	static String str = " ";
	static int[] a = new int[10];
	
	J31() {
		//网格布局管理器
		setLayout(new GridLayout(2, 1));
		
		//两个面板
		JPanel p1 = new JPanel();
		JPanel p2 = new JPanel();
		
		//标签和按钮
		JLabel l = new JLabel("登陆成功");
		 b = new JButton("生成10个随机数");
		//l.setFont(new Font("Serif", 1, 14));
		
		 //添加组件、面板
		p1.add(l); p2.add(b);
		add(p1); add(p2);
		
		//为按钮注册监听器
		b.addActionListener(this);
	}
	
	public static void main(String[] args) {new J31().setVisible(true);}
	
	//实现ActionListener接口抽象方法来完成具体事件
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();
		if (obj == b) {
			Random r = new Random();  //生成
			for (int i = 0; i < 10; i ++) {     //10个
				a[i] = r.nextInt(100);            //随机
				str = str + a[i] + " ";             //数
			}                                              
			new J411().setTitle("随机数排序算法窗口");  //设置新窗口的标题
			this.setVisible(false);
		}
	}

}

J41 extends J31

第四个窗口:
在这里插入图片描述
因为单独运行J41的缘故,所以没有生成随机数,整个程序应该从J12开始运行,这样才能展示出所有的功能

代码如下:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class J41 extends J31 implements ActionListener {

	JButton b;
	static JTextArea t;
	
	J411() {
		//设置布局管理器和面板
		setLayout(new GridLayout(2, 1));
		JPanel p1 = new JPanel();
		JPanel p2 = new JPanel();
		
		//设置文本区和按钮
		t = new JTextArea(str, 1, 20);
		b = new JButton("点击进行排序");
		b.addActionListener(this);
		
		p1.add(t); p2.add(b);
		add(p1); add(p2);
	}
	
	public static void main(String[] args) {new J411().setVisible(true);}

	//实现ActionListener接口抽象方法来完成具体事件
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();
		if (obj == b) {
			new J51().setTitle("随机数排序算法窗口");  //窗口重新命名
//			this.setVisible(false);
		}
	}

}

J51 extends J31

第五个窗口:
在这里插入图片描述
同样是单独运行J51的原因,没有生成随机数,排序后就都是0了
代码如下:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class J51 extends J31 /*implements ActionListener */ {  
	                         //因为父类J13已经实现了该接口,所以也可以不写
	JButton b;
	static String res = " ";
	
	J51() {
		//选择排序
		for (int i = 0; i < 9; i ++)
			for (int j = i+1; j < 10; j ++)
				if (a[i] > a[j]) {
					int temp = a[i];
					a[i] = a[j];
					a[j] = temp;
				}
		
//		//冒泡排序
//		for (int i = 0; i < 9; i ++)
//			for (int j = 0; j < 9-i; j ++)
//				if(a[j] > a[j+1]) {
//					············
//					············
//				}
		
		//用res来保存排好序的结果
		for (int i = 0; i < 10; i ++)
			res = res + a[i] + " ";
		
		//设置布局管理器和面板
		setLayout(new GridLayout(3, 1));
		JPanel p1 = new JPanel();
		JPanel p2 = new JPanel();
		JPanel p3 = new JPanel();
		
		//两个文本区用来放排序前后的10个随机数
		JTextArea t1 = new JTextArea(str, 1, 20);
		JTextArea t2 = new JTextArea(res, 1, 20);
		
		//将J31中的按钮对象重新命名(这就是要在J31中把b设置为静态的原因)
		J31.b.setText("重新生成10个随机数");
		//创建按钮注册监听器
		b = new JButton("已排序,点击结束");
		b.addActionListener(this);
		
		//添加各组件和面板
		p1.add(t1); p2.add(b); p3.add(t2);
		add(p1); add(p2); add(p3);
		
	}

	public static void main(String[] args) {
		
		new J51().setVisible(true);
		J41.t.setText("");  //这里要重新设定文本区内容(清空原来的内容)
	}
	
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();
		if (obj == b) {
			System.exit(0);  //这里就是出口了
		}
		if (obj == J31.b) {
			new J41().setTitle("随机数排序算法窗口");  //窗口标题重新命名
			J31.b.setText("想嘛呢?再排序会出错");  //按钮重新命名
			this.setVisible(false);
		}
	}

}

总结

##最后完成的效果:额,不会上传视频,等回头再传上去😅😅😅

因为我把登录窗口和随机数排序写成了一个项目,可能就会有些来回继承的关系,理清楚就好,实际考试的时候应该是两个题目的吧,也就不用这么复杂。

好了,关于期末考试,希望大家都不会挂科,老师课上强调的东西我也都有记下,大家可以参考:
在这里插入图片描述

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值