package com.competition;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.Timer;
import javax.swing.WindowConstants;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
/**
*
* ApplicationSoftware
*
* Description: 应用软件题
* 1、建立数据库,并在数据库中建立persons表,主要字段有姓名、密码、性别、年龄、专业。记录条数为10条。
* 2、软件具有登录窗口,登录窗口输入用户的姓名和密码,三次输入错误后软件自动退出,输入正确则进入主窗口。
* 3、主窗口用表格全屏显示每条记录中除密码外的其它内容,按年龄升序排列。
* 4、主窗口具有标题栏、菜单栏、工具栏、状态栏,标题显示“数据库查询软件”,菜单栏设计3个子菜单项,分别为退出、最小化、最大化。状态栏显示当前日期和时间、登录的用户名。
* 5、点击退出后,提醒用户是否确实退出,如果选择是则直接关闭退出,否则返回主界面。
*
* @date 2019-10-12 下午 03:35
*/
public class ApplicationSoftware {
private static Map map = Maps.newHashMap();
public static void main(String[] args) {
fun2();
}
private static void fun1() {
// JFrame jf = new JFrame();
JFrame jf = new JFrame("这里是标题");// 窗口标题
Container container = jf.getContentPane();// 创建容器
JLabel jl = new JLabel("这里是展示的内容");
// 使标签上的文字居中
jl.setHorizontalAlignment(SwingConstants.CENTER);
Font font = new Font("TimesRoman", Font.ITALIC, 25);
jl.setFont(font);
container.add(jl);// 添加上面的组件,不添加就显示不到
container.setBackground(Color.PINK);
jf.setVisible(true);// 窗口可视
jf.setSize(800, 400);// 窗口大小
// DO_NOTHING_ON_CLOSE 的意思是关不掉,哈哈,可以捉弄下小白
// jf.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);// 可以关掉
}
private static void fun2() {
JFrame jf = new JFrame();// 新建一个窗口
jf.setSize(800, 600);// 设置大小
jf.setTitle("数据库查询软件");// 设置标题
// jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);// 设置关闭按钮动作
// 一个窗口的面板分为三层 根面板和中间面板 以及内容面板, 组件全部放在内容 面板上面
// 获取到内容面板
Container con = jf.getContentPane();// 得到了内容面板
con.setLayout(null);
// 设置组件内容
// 设置标签组件
JLabel jl = new JLabel();
jl.setText("用户名:");// 设置标签的名称
jl.setForeground(Color.blue);//设置字体颜色
jl.setSize(80, 30);// 设置标签的大小
jl.setLocation(180, 200);// 设置标签存放位置
con.add(jl);// 把jl组件放在内容面板上
// 创建用户名输入文本框
JTextField username = new JTextField();// 创建文本框
username.setSize(100, 30);
username.setLocation(260, 200);// 设置位置
con.add(username);
// 创建密码标签
JLabel jl1 = new JLabel();
jl1.setText("密 码:");
jl1.setForeground(Color.blue);
jl1.setSize(80, 30);
jl1.setLocation(180, 250);// 设置密码存放位置
con.add(jl1);
// 创建密码输入文本框
JPasswordField passworld = new JPasswordField();
passworld.setSize(100, 30);
passworld.setLocation(260, 250);
con.add(passworld);
//登录按钮
JButton ok = new JButton("登录");
Font f = new Font("华文行楷", Font.BOLD, 20);
ok.setFont(f);
ok.setSize(150, 40);
ok.setLocation(150, 420);
con.add(ok);
// 取消按钮
JButton cancel = new JButton("取消");
cancel.setFont(f);
cancel.setSize(150, 40);
cancel.setLocation(420, 420);
con.add(cancel);
// 底部状态栏
con.setLayout(new BorderLayout());
ClockText clockText = new ClockText(null);
con.add(clockText, BorderLayout.SOUTH);
// 顶部工具栏
JMenuBar menuBar = new JMenuBar();
// 菜单操作
//创建并添加各菜单,注意:菜单的快捷键是同时按下Alt键和字母键,方法setMnemonic('F')是设置快捷键为Alt +F
JMenu menuFile = new JMenu("文件(F)");
JMenu menuEdit = new JMenu("编辑(E)");
JMenu menuView = new JMenu("查看(V)");
menuFile.setMnemonic('F');
menuEdit.setMnemonic('E');
menuView.setMnemonic('V');
JMenuItem open = new JMenu("打开");
JMenuItem save = new JMenu("保存");
menuFile.add(open);
menuFile.add(save);
menuBar.add(menuFile);
menuBar.add(menuEdit);
menuBar.add(menuView);
con.add(menuBar, BorderLayout.NORTH);
jf.addWindowListener(new WindowAdapter() {// 关闭按钮监听
@Override
public void windowClosing(WindowEvent e) {
int ret = JOptionPane.showConfirmDialog(null, "是否要退出?", "提示", JOptionPane.YES_OPTION);
if (ret == JOptionPane.YES_OPTION) {
jf.dispose();
}
}
});
ok.addActionListener(new ActionListener() {//创建登陆按钮的动作监听器
@Override
public void actionPerformed(ActionEvent e) {
String name = username.getText();//获取到用户名文本框的内容
String pass = passworld.getText();//获取到密码文本框的内容
if (name.equals("admin") && pass.equals("123456")) {
// JOptionPane.showMessageDialog(null, "正在登陆");
// 删除添加的组件
con.remove(jl);
con.remove(username);
con.remove(jl1);
con.remove(passworld);
con.remove(ok);
con.remove(cancel);
con.remove(clockText);
List list = Lists.newArrayList();
for (int i = 0; i < 5; i++) {
Person person = new Person();
person.setName("姓名 :" + i);
person.setSex("性别 1男 0女 :" + i % 2);
person.setAge("年龄 :" + i);
person.setMajor("专业 :" + i);
list.add(person);
}
List ignore = Lists.newArrayList();
ignore.add("serialVersionUID");
ignore.add("pwd");
Person person = new Person();
Field[] fields = person.getClass().getDeclaredFields();
String[] names = new String[(fields.length - ignore.size())];
Object[][] data = new Object[list.size()][(fields.length - ignore.size())];
getData(list, data, names, ignore);
// 创建表格中的横标题
JTable table = new JTable(data, names);
// 设置此表视图的首选大小
table.setPreferredScrollableViewportSize(new Dimension(800, 550));
// 将表格加入到滚动条组件中
JScrollPane scrollPane = new JScrollPane(table);
// 再将滚动条组件添加到中间容器中
con.add(scrollPane, BorderLayout.CENTER);
clockText.setUserName(name);
con.add(clockText, BorderLayout.SOUTH);
con.repaint();// 重新生成页面
jf.pack(); // 自适应大小
} else {
JOptionPane.showMessageDialog(null, "用户名或者密码不正确,请重新输入");
passworld.setText(null);
// 判断是否达到最大点击次数
Integer count = map.get(name);
if (count != null) {
count++;
if (count > 2) {
jf.dispose();
}
} else {
count = 1;
}
map.put(name, count);
}
//这个地方应该加一个自动刷新验证码的功能,不管是验证码错误,还是账号密码错误,都重新输入验证码
}
});
cancel.addActionListener(new ActionListener() {//创建取消按钮的事件监听器
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
jf.dispose();
}
});
jf.setVisible(false);
jf.setVisible(true); // 放到最后,否则添加的组件显示错误
}
// 把一个字符串的第一个字母大写、效率是最高的、
private static String getMethodName(String fildeName) throws Exception {
byte[] items = fildeName.getBytes();
items[0] = (byte) ((char) items[0] - 'a' + 'A');
return new String(items);
}
// 获取表格数据
private static void getData(List source, Object[][] data, String[] title, List ignore) {
int index = 0;
Object o = source.get(0);
Field[] field = o.getClass().getDeclaredFields();
for (int i = 0; i < field.length; i++) {
String name = field[i].getName();
if (!ignore.contains(name)) {
title[index] = field[i].getName();
index++;
}
}
for (int i = 0; i < source.size(); i++) {
Object object = source.get(i);
Object[] personData = new Object[title.length];
for (int j = 0; j < title.length; j++) {
try {
Method m = object.getClass().getMethod("get" + getMethodName(title[j]));
// 调用getter方法获取属性值
personData[j] = m.invoke(object);
} catch (Exception e) {
e.printStackTrace();
}
}
data[i] = personData;
}
}
// 状态栏 时间 当前登录人
static class ClockText extends JTextField implements ActionListener {
Calendar c;
private Timer t;
private String userName;
ClockText() {
super();
s();
this.addActionListener(this);
t.start();
}
ClockText(int i) {
super(i);
s();
this.addActionListener(this);
t.start();
}
ClockText(int i, String userName) {
super(i);
this.userName = userName;
s();
this.addActionListener(this);
t.start();
}
ClockText(String userName) {
super();
this.userName = userName;
s();
this.addActionListener(this);
t.start();
}
String getUserName() {
return userName;
}
void setUserName(String userName) {
this.userName = userName;
}
void s() {
t = new Timer(1000, this);
}
@Override
public void actionPerformed(ActionEvent e) {
c = Calendar.getInstance();
StringBuffer sb = new StringBuffer();
sb.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(c.getTime()));
if (StringUtils.isNotBlank(userName)) {
sb.append(" ");
sb.append("当前登录人:");
sb.append(userName);
}
this.setText(sb.toString());
}
}
}
package com.competition;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import java.io.Serializable;
/**
*
* Person
*
* Description: 人员表
*
* @date 2019-10-12 下午 05:14
*/
@Data
public class Person implements Serializable {
private static final long serialVersionUID = -9211083194694937903L;
/** 姓名 */
private String name;
/** 密码 */
private String pwd;
/** 性别 */
private String sex;
/** 年龄 */
private String age;
/** 专业 */
private String major;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}