JFrame


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;

/**
 * <p>
 * <code>ApplicationSoftware</code>
 * </p>
 * Description: 应用软件题
 * 1、建立数据库,并在数据库中建立persons表,主要字段有姓名、密码、性别、年龄、专业。记录条数为10条。
 * 2、软件具有登录窗口,登录窗口输入用户的姓名和密码,三次输入错误后软件自动退出,输入正确则进入主窗口。
 * 3、主窗口用表格全屏显示每条记录中除密码外的其它内容,按年龄升序排列。
 * 4、主窗口具有标题栏、菜单栏、工具栏、状态栏,标题显示“数据库查询软件”,菜单栏设计3个子菜单项,分别为退出、最小化、最大化。状态栏显示当前日期和时间、登录的用户名。
 * 5、点击退出后,提醒用户是否确实退出,如果选择是则直接关闭退出,否则返回主界面。
 *
 * @date 2019-10-12 下午 03:35
 */
public class ApplicationSoftware {

    private static Map<String, Integer> 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<Person> 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<String> 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<Person> source, Object[][] data, String[] title, List<String> 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;

/**
 * <p>
 * <code>Person</code>
 * </p>
 * 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);
    }
}
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值