Java Swing解析版:图书管理系统(1)实战项目开发


package swingPackage;
public class DiaoYongFangFa {
public static void main(String[] args) {
/* swing类 */
new swingClass();
/* JTable界面 */
// new JTableJieMian();
}
}


package swingPackage;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.JTextField;
///*每一个事件源需要一个监听器(ActionListener)
//ActionListener用于接收操作事件的侦听器接口。对处理操作事件的类可以实现此接口,
//而使用该类创建的对象可使用组件的 addActionListener 方法向该组件注册。
//在发生操作事件时,调用该对象的 actionPerformed 方法。
//接口focusListener的用于接收键盘焦点事件。过程焦点事件的类需要实现这个接口。
//implements是一个类,实现一个接口用的关键字,它是用来实现接口中定义的抽象方法。
//实现一个接口,必须实现接口中的所有方法。
//接口可以被多重实现(implements),抽象类只能被单一继承(extends)*/
class shijian implements ActionListener, FocusListener {
static swingClass d = null;
/* 下面的是构造方法,无void */
public shijian(swingClass dl) {
d = dl;
}
@Override
/*
*
*
*
*
*
*
*
* actionperformed方法是ActionListener监听事件中的一个重写方法,
*
*
*
*
*
*
*
* 如果要求按钮执行一些动作,可以在这个方法中添加、修改、删除以及判断。
*/
/*
*
* // * actionPerformed按钮单击方法。public void actionPerformed(ActionEvent e) //
*
* * 这是接口ActionListener里面定义的一个抽象方法,所有实现这个接口的类都要重写这个方法。 // *
*
* 一般情况下,这是在编写GUI程序时,组件发生“有意义”的事件时会调用这个方法,比如按钮被按下, // *
*
* 文本框内输入回车时都会触发这个事件,然后调用你编写的事件处理程序。 // *
*
* 实现过程大体如下:编写一个ActionListener类的侦听器,组件注册该侦听器, // *
*
* 侦听器内部要编写这个actionPerformed方法。e可写成arg0, arg: argument of a complex number
*
* // * 复数的辐角,自变量(argument)。 arg0在Java中表示什么意思? // *
*
* 就是一个变量名。可以自己定义,一般主函数里面传的参数名叫args,取其中第一个就是:args[0],但也不是arg0, // *
*
* 具体表示什么意思,从英语意义上来说的话,应该是参数或者变量的第一个。 //
*/
public void actionPerformed(ActionEvent arg0) {
/*
*
* 当按钮中字符为"登录"时,就执行equals("登录")中的内容。
*
* 以“按纽”的事件为例,同一个JFrame里可能有多个按钮的事件,为了避免冲突, 给每个按钮设置不同的 ActionCommand,
*
* 在监听时间的时候,用这个做条件区分事件,以做不同的响应。
*
* 而这个e.getActionCommand方法返回String,通过这个String能判断是哪个按钮触发了事件。
*/
if (arg0.getActionCommand().equals("已经注册过,可直接登录")) {
/* trim()函数移除字符串两侧的空白字符或其他预定义字符。 */
/*
*
* swingClass.uname.getText().trim();翻译一下:在下面的 public class
*
* swingClass extends JFrame {} 中获得去空格后得到的定义的unme的文本内容“1”
*/
String uname = swingClass.uname.getText().trim();
/* uname.isEmpty() 翻译一下:uname变量为空 */
String pwd = swingClass.pwd.getText().trim();
if (uname.isEmpty() || pwd.isEmpty()) {
JOptionPane.showMessageDialog(null, "用户名或密码为空");
} else {
if (uname.equals(yonghu.uname) && pwd.equals(yonghu.pwd)) {
JOptionPane.showMessageDialog(null, "用户名和密码输入正确,可以登录");
new ChengGongDengLuHouDejiemian();
/* JTable界面 */
/*
*
* // * 用new实例化成功登录后的界面的窗口, // * 调用显示窗口的界面 //
*/
/* 将Class_DengLu中的登录的界面设置为可见的(true)或隐藏的(false)。 */
new JTableJieMian();
d.setVisible(false);
} else {
JOptionPane.showMessageDialog(null, "用户名或密码输入错误");
}
}
}
else if (arg0.getActionCommand().equals("没注册过,先注册")) {
JOptionPane.showMessageDialog(null, "没注册过,先注册");
} else {
/*
*
* // * int o(o为OPTION“选择”的缩写) = JOptionPane.showConfirmDialog(null,
*
* // * "是否确认关闭页面");就是在关闭一个界面东西 的时候, 还会跳出一个询问框问是否要真的退出。 // * // *
*
* setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // *
*
* addWindowListener(new WindowAdapter(){ public void // *
*
* windowClosing(WindowEvent e){ int o // *
*
* =JOptionPane.showConfirmDialog(null,"退出?"); // *
*
* if(o==JOptionPane.OK_OPTION){ System.exit(0); } } }); //
*/
int o = JOptionPane.showConfirmDialog(null, "是否确认关闭页面");
if (o == 0) {
/* exit()的参数是退出的状态。惯例:为0是正常退出,非零为异常退出 */
System.exit(0);
}
}
}
/*
*
*
*
*
*
*
*
* arg是java主函数的入口参数,它是一个字符串数组变量 void focusGained(FocusEvent e):当获得焦点时发生.
*
*
*
*
*
*
*
* void focusLost(FocusEvent e):当失去焦点时发生.
*/
// /*
// * focusLost:此事件指示 Component 不再是焦点所有者。下面是事件方法。个人理解:“
// * 焦点”表示点击了有内容等框等。arg0.getSource() == Class_DengLu.uname翻译:获取的输入框的内容
// */
@Override
public void focusGained(FocusEvent arg0) {
if (arg0.getSource() == d.uname) {
/*
*
* // * System.out.println("选中了用户名框");显示在编译器上。这里的arg0.getSource() ==
*
* // * Class_DengLu.uname翻译:点击了输入框 //
*/
System.out.println("选中了用户名框");
} else if (arg0.getSource() == d.pwd) {
// /* getSource方法返回的是对象 即触发这个按钮,执行得到的 */
System.out.println("选中了密码框");
} else if (arg0.getSource() == d.pwd1) {
System.out.println("选中了确认密码框");
}
}
@Override
public void focusLost(FocusEvent arg0) {
if (arg0.getSource() == d.uname) {
/* getSource获得所选 */
String uname = d.uname.getText();
if (uname.isEmpty()) {
d.lb_uname_panduan.setText("请输入用户名");
d.lb_uname_panduan.setForeground(Color.red);
} else {
if (uname.length() > 12 || uname.length() == 0) {
d.lb_uname_panduan.setText("用户名格式输入错误");
d.lb_uname_panduan.setForeground(Color.red);
} else {
d.lb_uname_panduan.setText("用户名输入正确");
d.lb_uname_panduan.setForeground(Color.green);
}
}
} else if (arg0.getSource() == d.pwd) {
String pwd = d.pwd.getText().trim();
if (pwd.length() < 6 || pwd.length() == 0) {
d.lb_pwd_panduan.setText("密码格式输入错误,不可少于6位");
d.lb_pwd_panduan.setForeground(Color.red);
} else {
d.lb_pwd_panduan.setText("输入正确");
d.lb_pwd_panduan.setForeground(Color.green);
}
/*
*
* // * // * arg是java主函数的入口参数,它是一个字符串数组变量 void
*
* focusGained(FocusEvent e): 当获得焦点时发生. // * // * void
*
* focusLost(FocusEvent e):当失去焦点时发生. //
*/
// /*
// * focusGained:此事件指示 Component(组成部分) 现在是焦点所有者。
// *
// * 前面有class shijian implements ActionListener, FocusListener {}
// */
} else if (arg0.getSource() == d.pwd1) {/*
*
*
*
* 做判断两次密码是否一致的判断
*
*
*
*
*
*
*
* 先获取第一次输入的密码,再获取第二次输入的密码,
*
*
*
* 然后比较一下两次密码是否一致不就完啦
*/
String pwd1 = d.pwd.getText().trim();// 获取第一次的密码
String pwd2 = d.pwd1.getText().trim();// 获取第二次输入的密码.
if (pwd1.equals(pwd2)) {
d.lb_pwd_queren.setText("输入正确");
d.lb_pwd_queren.setForeground(Color.GREEN);
} else {
d.lb_pwd_queren.setText("两次密码输入不一致");
d.lb_pwd_queren.setForeground(Color.red);
}
}
}
}
//
// /*
// * JFrame是java中的一个类,它是一个容器,允许程序员把其他组件(Swing 的三个基本构造块:标签、
// * 按钮和文本字段)添加到它里面,把它们组织起来,并把它们呈现给用户。
// * JFrame是一个顶层的框架类,好比一个窗户的框子。也是一个容器类。这个框子可以嵌入几个玻璃窗。
// */
// /* JButton类是按钮的实现。该组件具有标签,并在按下时生成事件。它也可以有一个图像。 */
/*
*
* 定义为静态变量以便使用 ,CheckBox控件就是我们一般所说的复选框(选择多个选项,“多选框”, 选爱好等), 通常用于某选项的打开或关闭
*/
// static JCheckBox JCheckBox_aihao1, JCheckBox_aihao2,
// JCheckBox_aihao3 = null;
// /*
// * JComboBox类是一个组合按钮或可编辑字段和下拉列表(LieBiao)的组件。
// */
// static JComboBox JComboBox_XiaLaLieBiao = null;
// /*
// * JLabel等是一些基础组件,它必须置于某个容器里,类似于窗花、剪纸,必须置于窗户的表面。
// * JLabel类可以显示文本或图像。通过在显示区域中设置垂直和水平对齐来对齐标签的内容。
// * 默认情况下,标签在显示区域中垂直居中。默认情况下,纯文本标签前沿对齐;
// * 默认情况下,仅图像标签水平居中。//原文出自【易百教程】,商业转载请联系作者获得授权
// * ,非商业请保留原文链接:https://www.yiibai.com/swing/swing_jlabel.html
// */
// static JLabel JLabel_uname, JLabel_qrmima, JLabel_sex, JLabel_aihao,
// JLabel_address,
//
// JLabel_jieshao, JLabel_uname_panduan, JLabel_pwd_panduan,
// JLabel_pwd,
//
// JLabel_pwd_queren = null;
// /* JPasswordField类是一个专门处理密码功能并允许编辑单行文本的组件。 */
// static JPasswordField pwd, pwd1 = null;
// /* JRadioButton类是单选按钮的实现 ,可以选择或取消选择的项,并向用户显示其状态。 */
// static JRadioButton JRadioButton_sex_man, JRadioButton_sex_woman = null;
// /* JTextArea类是一个显示纯文本的多行(DuoHang)区域。 */
// static JTextArea JTextArea_DuoHang = null;
// /* JTextField类是一个允许编辑单行文本的组件。Field领域美(美式 读音音标:[fild]) */
// static JTextField JTextField_uname;
//
// /*
// * JFrame是java中的一个类,它是一个容器,允许程序员把其他组件(Swing 的三个基本构造块:标签、
// * 按钮和文本字段)添加到它里面,把它们组织起来,并把它们呈现给用户。
// * JFrame是一个顶层的框架类,好比一个窗户的框子。也是一个容器类。这个框子可以嵌入几个玻璃窗。
// */
/* JFrame f = new JFrame();创建FRame对象f,并用构造方法进行实例化 */
public class swingClass extends JFrame {
/*
*
* // * 定义为静态变量以便使用 ,CheckBox控件就是我们一般所说的复选框(选择多个选项,“多选框”, 选爱好等),
*
* 通常用于某选项的打开或关闭 //
*/
static JCheckBox aihao1, aihao2, aihao3 = null;
/*
*
* // * JComboBox类是一个组合按钮或可编辑字段和下拉列表(LieBiao)的组件。 //
*/
static JComboBox com1 = null;
/* JButton类是按钮的实现。该组件具有标签,并在按下时生成事件。它也可以有一个图像。 */
static JButton DengLuAnNu, QuXiaoAnNu, ZhuCeMiMaAnNu = null;
/* JTextArea类是一个显示纯文本的多行(DuoHang)区域。 */
static JTextArea jt1 = null;
/*
*
* // * JLabel等是一些基础组件,它必须置于某个容器里,类似于窗花、剪纸,必须置于窗户的表面。 // *
*
* JLabel类可以显示文本或图像。通过在显示区域中设置垂直和水平对齐来对齐标签的内容。 // *
*
* 默认情况下,标签在显示区域中垂直居中。默认情况下,纯文本标签前沿对齐; // * 默认情况下,仅图像标签水平居中。 //
*/
static JLabel lb_uname, lb_qrmima, lb_sex, lb_aihao, lb_address,
lb_jieshao = null;
static JLabel lb_uname_panduan, lb_pwd_panduan, lb_pwd,
lb_pwd_queren = null;
/* JPasswordField类是一个专门处理密码功能并允许编辑单行文本的组件。 */
static JPasswordField pwd, pwd1 = null;
/* JRadioButton类是单选按钮的实现 ,可以选择或取消选择的项,并向用户显示其状态。 */
static JRadioButton sex_man, sex_woman = null;
/* JTextField类是一个允许编辑单行文本的组件。Field领域美(美式 读音音标:[fild]) */
static JTextField uname;
shijian sj = new shijian(this);
/* this就是指对象自己,表示自己,在那个对象的成员函数里出现就表示哪个对象 */
public swingClass() {
/* 总界面设置 */
this.setTitle("登录界面");
this.setSize(700, 600);
// location:地点
// relative:亲属
this.setLocationRelativeTo(null);
this.setLayout(null);
/* 用户名 */
lb_uname = new JLabel("用户名");
this.add(lb_uname);
lb_uname.setBounds(100, 100, 40, 30);
/* setBounds(x,y,size_x,size_y) */
uname = new JTextField(20);
uname.setBounds(180, 100, 140, 30);
uname.addFocusListener(sj);
this.add(uname);
lb_uname_panduan = new JLabel("用户名长度不能大于12位");
lb_uname_panduan.setForeground(Color.red);
lb_uname_panduan.setBounds(330, 100, 250, 30);
this.add(lb_uname_panduan);
/* 密 码 */
lb_pwd = new JLabel("密 码");
this.add(lb_pwd);
lb_pwd.setBounds(100, 140, 40, 30);
pwd = new JPasswordField();
pwd.setBounds(180, 140, 140, 30);
pwd.addFocusListener(sj);
this.add(pwd);
lb_pwd_panduan = new JLabel("请输入密 码,不可少与6位");
lb_pwd_panduan.setForeground(Color.red);
lb_pwd_panduan.setBounds(330, 140, 240, 30);
this.add(lb_pwd_panduan);
// lb_pwd_panduan = new JLabel("请确认密码");
// lb_pwd_panduan.setForeground(Color.red);
// lb_pwd_panduan.setBounds(330, 140, 150, 30);
// this.add(lb_pwd_panduan);
/* 确认密码 */
lb_qrmima = new JLabel("确认密码");
lb_qrmima.setBounds(100, 180, 70, 30);
this.add(lb_qrmima);
pwd1 = new JPasswordField(20);
pwd1.setBounds(180, 180, 140, 30);
// pwd1.addFocusListener(sj);
pwd1.addFocusListener(new shijian(this));
this.add(pwd1);
lb_pwd_queren = new JLabel("请输入和上一 次一致的密码");
lb_pwd_queren.setForeground(Color.red);
lb_pwd_queren.setBounds(330, 180, 180, 30);
this.add(lb_pwd_queren);
lb_pwd_queren.addFocusListener(sj);
lb_sex = new JLabel("性别");
lb_sex.setBounds(100, 210, 70, 30);
this.add(lb_sex);
sex_woman = new JRadioButton("女");
sex_man = new JRadioButton("男", true);
sex_man.setBounds(180, 210, 70, 30);
sex_woman.setBounds(260, 210, 70, 30);
this.add(sex_man);
this.add(sex_woman);
ButtonGroup bg1 = new ButtonGroup();
bg1.add(sex_man);
bg1.add(sex_woman);
lb_aihao = new JLabel("爱好");
lb_aihao.setBounds(100, 250, 70, 30);
this.add(lb_aihao);
aihao1 = new JCheckBox("唱");
aihao2 = new JCheckBox("跳");
aihao3 = new JCheckBox("rap");
aihao1.setBounds(180, 250, 70, 30);
aihao2.setBounds(250, 250, 70, 30);
aihao3.setBounds(320, 250, 70, 30);
this.add(aihao1);
this.add(aihao2);
this.add(aihao3);
lb_address = new JLabel("家庭地址");
lb_address.setBounds(100, 290, 70, 30);
this.add(lb_address);
com1 = new JComboBox();
// item
//
// 一条
com1.addItem("请选择家庭地址");
com1.addItem("北京");
com1.addItem("上海");
com1.addItem("广州");
com1.setBounds(180, 290, 140, 30);
this.add(com1);
lb_jieshao = new JLabel("个人介绍");
lb_jieshao.setBounds(100, 330, 70, 30);
this.add(lb_jieshao);
jt1 = new JTextArea();
// columns:列
jt1.setColumns(8);
jt1.setRows(4);
jt1.setBounds(180, 330, 140, 40);
// wrap:换行;
/* setLineWrap:设置自动换行 */
jt1.setLineWrap(true);
this.add(jt1);
JButton btn_dl = new JButton("已经注册过,可直接登录");
btn_dl.setBounds(20, 400, 180, 35);
QuXiaoAnNu = new JButton("取消");
ZhuCeMiMaAnNu = new JButton("没注册过,先注册");
ZhuCeMiMaAnNu.setBounds(368, 400, 180, 35);
QuXiaoAnNu.setBounds(240, 400, 80, 35);
btn_dl.addActionListener(sj);
ZhuCeMiMaAnNu.addActionListener(sj);
QuXiaoAnNu.addActionListener(sj);
this.add(btn_dl);
this.add(ZhuCeMiMaAnNu);
this.add(QuXiaoAnNu);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// visible
//
// 可见的
this.setVisible(true);
}
}
class yonghu {
static String pwd = "pwdpwd";
static String uname = "1";
}

