文章目录
- 前言
- J1*
- J10
- J11 extends J10
- J12 extends J11
- J21 extends J10
- J31 extends J10
- J41 extends J31
- J51 extends J31
- 总结
前言
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);
}
}
}
总结
##最后完成的效果:额,不会上传视频,等回头再传上去😅😅😅
因为我把登录窗口和随机数排序写成了一个项目,可能就会有些来回继承的关系,理清楚就好,实际考试的时候应该是两个题目的吧,也就不用这么复杂。