前言
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);
}
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj == b2) {
new 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() {
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位");
}
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj == b) {
this.setVisible(false);
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个随机数");
p1.add(l); p2.add(b);
add(p1); add(p2);
b.addActionListener(this);
}
public static void main(String[] args) {new J31().setVisible(true);}
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj == b) {
Random r = new Random();
for (int i = 0; i < 10; i ++) {
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);}
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj == b) {
new J51().setTitle("随机数排序算法窗口");
}
}
}
J51 extends J31
第五个窗口: 同样是单独运行J51的原因,没有生成随机数,排序后就都是0了 代码如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class J51 extends J31 {
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 < 10; i ++)
res = res + a[i] + " ";
setLayout(new GridLayout(3, 1));
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
JPanel p3 = new JPanel();
JTextArea t1 = new JTextArea(str, 1, 20);
JTextArea t2 = new JTextArea(res, 1, 20);
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);
}
}
}
总结
##最后完成的效果:额,不会上传视频,等回头再传上去😅😅😅
因为我把登录窗口和随机数排序写成了一个项目,可能就会有些来回继承的关系,理清楚就好,实际考试的时候应该是两个题目的吧,也就不用这么复杂。
好了,关于期末考试,希望大家都不会挂科,老师课上强调的东西我也都有记下,大家可以参考:
|