实验十五 Java Swing 图形用户界面程序设计应用

实验内容与结果

1 、实现一个计算器。

2 、实现一个记事本程序。

3创建一用户登录界面, 接受用户输入的帐号和密码, 给三次输入机会,要求连接

数据库实现。

计算器

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
//计算器
public class Work14_1 extends JPanel {
    public Graphics g = null;

    public static void main(String[] args) {
        Work14_1 w = new Work14_1();
        w.run();
    }

    public void run() {
        CouterListener couterListener = new CouterListener();
        // 窗体标题
        JFrame frame = new JFrame("Calculate");
        // 布局:上下左右的间距为10
        FlowLayout fl = new FlowLayout(FlowLayout.CENTER, 10, 10);
        frame.setLayout(fl);
        // 界面的的尺寸
        frame.setSize(270, 400);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(3);
        // 固定窗体的大小,无法通过鼠标改变大小
        frame.setResizable(false);

        // 多行文本框
        JTextArea field = new JTextArea();
        // 文本框的尺寸
        field.setPreferredSize(new Dimension(250, 50));

        // 设置最外层Frame的行数为2,一行放文本框,一行放按钮
        field.setRows(3);
        frame.add(field);
        // 背景颜色(可根据自己要求进行修改)
        frame.setBackground(Color.GRAY);
        couterListener.setJText(field);
        // 按钮布局,可以根据需要进行修改
        String BtArray[] = { "1", "2", "3", "+",
                "4", "5", "6", "-",
                "7", "8", "9", "*",
                ".", "0", "=", "/" };

        // 按钮一共4行4列
        this.setLayout(new GridLayout(4, 4, 10, 10));
        frame.add(this);
        for (int i = 0; i < 16; i++) {
            JButton button = new JButton(BtArray[i]);
            // 按钮的颜色
            button.setForeground(Color.DARK_GRAY);
            button.setPreferredSize(new Dimension(50, 50));
            button.setContentAreaFilled(false);
            this.add(button);
            // 给按钮绑定点击事件
            button.addActionListener(couterListener);
        }
        //添加CE按钮
        JButton ce = new JButton("CE");
        ce.setForeground(Color.DARK_GRAY);
        ce.setPreferredSize(new Dimension(250, 50));
        ce.setContentAreaFilled(false);
        ce.addActionListener(couterListener);
        frame.add(ce);

        // 使窗口显示
        frame.setVisible(true);
        g = frame.getGraphics();
    }
}

class CouterListener implements ActionListener {
    // 文本域对象
    private JTextArea JF;
    public int x = 0;
    //记录最新输入的是否为数字
    public boolean isNumber = true;
    // 结果
    public Double resulte = 0.0, temp = 0.0;
    public String num[] = new String[3];
    // 用于保存等号之前一次的运算符,比如 + - * /
    public String count;

    // 设置文本域
    public void setJText(JTextArea F) {
        JF = F;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // 运算符事件:+ - * / 运算符
        ArrayList calculateCommands = new ArrayList<String>();
        calculateCommands.add("+");
        calculateCommands.add("-");
        calculateCommands.add("*");
        calculateCommands.add("/");
        // 获得当前的命令
        String command = e.getActionCommand();
        if ("CE".equals(command)) {
            // 归零
            resulte = temp = 0.0;
            count = "";
            JF.setText("");
            isNumber = true;
        }else if (calculateCommands.contains(command)) {
            // + - * /
            JF.setText(JF.getText() + command + "\n");
            if (isNumber) {
                //输入运算符时,result保存运算符之前的数
                resulte = temp;
            }
            // 保存本次的运算符
            count = e.getActionCommand();
            isNumber = false;
        } else if ("=".equals(command)) {
            // 计算结果
            if ("+".equals(count)) {
                resulte = resulte + temp;
                JF.setText(resulte + "");
            } else if ("-".equals(count)) {
                resulte = resulte - temp;
                JF.setText(resulte + "");
            } else if ("*".equals(count)) {
                resulte = resulte * temp;
                JF.setText(resulte + "");
            } else if ("/".equals(count)) {
                resulte = resulte / temp;
                JF.setText(resulte + "");
            }
        } else {
            //输入的不是 ce + - * / = 的时候,即输入的是数字的时候
            JF.setText(JF.getText() + command);
            if (!isNumber) {
                //如果上一次输入的是字符
                //正则表达式:根据换行符[\n]将文本框内字符串变成字符串数组
                num = JF.getText().split("\\n");
                //将运算符后面的(即换行符后面的)数字保存到temp中去
                temp = Double.parseDouble(num[1]);

                // 将下面注释打开就可以知道num和temp的作用了
                System.out.println("num: ");
                for (int i = 0; i < num.length; i++) {
                    System.out.printf("[" + i + "]:\"" +num[i] + "\"\n");
                }
                System.out.println("temp: " + temp);
            } else {
                //如果是第一次输入数字
                temp = Double.parseDouble(JF.getText());
            }
        }
    }
}

图形界面如下: 

 

记事本

import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
//记事本
//以上都是一些需要用到的库类
public class Work14_2 {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(Work14_2::creatGUI);
    }

    public static void creatGUI() {
        //创建可视化窗口
        JFrame f = new JFrame("记事本程序");
        //设定显示位置,左上角为(0,0),根据笔记本电脑的显示分辨率设置成在正中间显示
        f.setLocation(480, 270);//这是显示窗口的左上角坐标
        //设定窗口大小为屏幕1/2倍(电脑显示分辨率)
        f.setSize(960, 540);//我电脑显示分辨率为1920*1080
        //创建文本域用来打字显示出来的
        JTextArea WBY = new JTextArea("Hello");//这里可以输入东西到时候打开窗体自动显示出来
        WBY.setFont(new Font("", Font.BOLD, 25));
        //设置文本域为自动换行
        WBY.setLineWrap(true);
        //将文本域添加到含有下拉框的面板中
        JScrollPane MB = new JScrollPane(WBY);
        //将含有下拉框的面板放入内容面板中
        f.add(MB);
        //创建一个菜单栏
        JMenuBar cdl = new JMenuBar();
        //创建菜单栏上的5个菜单并且设置字体和大小
        JMenu m1 = new JMenu("文件");
        JMenu m2 = new JMenu("编辑");
        JMenu m3 = new JMenu("字体大小");
        JMenu m4 = new JMenu("字体颜色");
        JMenu m5 = new JMenu("帮助文档");
        m1.setFont(new Font("", Font.BOLD, 25));
        m2.setFont(new Font("", Font.BOLD, 25));
        m3.setFont(new Font("", Font.BOLD, 25));
        m4.setFont(new Font("", Font.BOLD, 25));
        m5.setFont(new Font("", Font.BOLD, 25));
        //在菜单的基础上创建下拉可选菜单项按钮
        JMenuItem x1 = new JMenuItem("新建");
        JMenuItem x2 = new JMenuItem("保存");
        JMenuItem x3 = new JMenuItem("打开");
        JMenuItem x4 = new JMenuItem("退出");
        JMenuItem x5 = new JMenuItem("复制");
        JMenuItem x6 = new JMenuItem("粘贴");
        JMenuItem x7 = new JMenuItem("裁剪");
        JMenuItem x8 = new JMenuItem("删除");
        JMenuItem x9 = new JMenuItem("大");
        JMenuItem x10 = new JMenuItem("中");
        JMenuItem x11 = new JMenuItem("小");
        JMenuItem x12 = new JMenuItem("红色");
        JMenuItem x13 = new JMenuItem("绿色");
        JMenuItem x14 = new JMenuItem("蓝色");
        JMenuItem x15 = new JMenuItem("黑色");
        JMenuItem x16 = new JMenuItem("百度");
        //为下拉可选菜单项设置字体和大小
        x1.setFont(new Font("s", Font.BOLD, 20));
        x2.setFont(new Font("s", Font.BOLD, 20));
        x3.setFont(new Font("s", Font.BOLD, 20));
        x4.setFont(new Font("s", Font.BOLD, 20));
        x5.setFont(new Font("s", Font.BOLD, 20));
        x6.setFont(new Font("s", Font.BOLD, 20));
        x7.setFont(new Font("s", Font.BOLD, 20));
        x8.setFont(new Font("s", Font.BOLD, 20));
        x9.setFont(new Font("s", Font.BOLD, 40));
        x10.setFont(new Font("s", Font.BOLD, 30));
        x11.setFont(new Font("s", Font.BOLD, 20));
        x12.setFont(new Font("s", Font.BOLD, 20));
        x13.setFont(new Font("s", Font.BOLD, 20));
        x14.setFont(new Font("s", Font.BOLD, 20));
        x15.setFont(new Font("s", Font.BOLD, 20));
        x16.setFont(new Font("s", Font.BOLD, 20));
        //给颜色下拉菜单项分别设置相应的背景色,这样展现就会直观一点了
        x12.setBackground(Color.RED);
        x13.setBackground(Color.GREEN);
        x14.setBackground(Color.BLUE);
        x15.setBackground(Color.BLACK);
        //实现新建记事本按钮的功能
        x1.addActionListener(e -> {
            creatGUI();
        });//再次调用该方法创建另外一个记事本
        //实现保存记事本按钮的功能
        x2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e2) {
                //创建一个窗体并且设置窗体标题和保存功能
                FileDialog fileDialog = new FileDialog(f, "保存文件至", FileDialog.SAVE);
                //保存文件的对话框设置为可见
                fileDialog.setVisible(true);
                //获取保存的路径和设置的文件名
                String absPath = fileDialog.getDirectory() + fileDialog.getFile();
                try {//用来检测是否设置了保存路径
                    //设置输出文件名为保存的路径下面的文件名
                    BufferedWriter wr = new BufferedWriter(new FileWriter(absPath));
                    //获取文本域字符串
                    String s = WBY.getText();
                    //开始写入
                    wr.write(s);
                    //写完关闭
                    wr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        //实现打开记事本按钮的功能
        x3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e2) {
                //创建一个窗体并且设置窗体标题和打开功能
                FileDialog fileDialog = new FileDialog(f, "打开文件", FileDialog.LOAD);
                //打开文件的对话框设置为可见
                fileDialog.setVisible(true);
                //获取打开的路径和设置的文件名
                String absPath = fileDialog.getDirectory() + fileDialog.getFile();
                try {//用来检测是否设置了打开路径
                    //设置读入文件名为打开的路径下面的文件名
                    BufferedReader re = new BufferedReader(new FileReader(absPath));
                    String line;
                    while ((line = re.readLine()) != null)
                        //只要文件中不为空就不断追加到文本框中
                        WBY.append(line + '\n');
                    //读取完毕结束
                    re.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        //实现退出记事本按钮的功能
        x4.addActionListener(e -> System.exit(0));
        //调用文件工具箱下的系统剪贴板方法
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        //实现复制文本按钮的功能
        x5.addActionListener(e -> {
            //将选中的文本内容存入text中
            String text = WBY.getSelectedText();
            //传送到字符串里面存着
            StringSelection selection = new StringSelection(text);
            //将得到的内容放入到剪切板中
            clipboard.setContents(selection, null);
        });
        //实现粘贴文本按钮的功能
        x6.addActionListener(e -> {
            //获取系统剪贴板中的内容
            Transferable text = clipboard.getContents(null);
            //判断剪贴板中的内容是否支持文本
            if (text.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                try {
                    //强制转换剪贴板中的内容
                    String text1 = (String) text.getTransferData(DataFlavor.stringFlavor);
                    //获取当前光标的位置
                    int n=WBY.getCaretPosition();
                    //插入复制的内容到文本框的光标后面
                    WBY.insert(text1,n);
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
        });
        //实现裁剪文本按钮的功能
        x7.addActionListener(e -> {
            //将得到的选择文本内容存入text中
            String text = WBY.getSelectedText();
            //传送到字符串里面存着
            StringSelection selection = new StringSelection(text);
            //将得到的内容放到剪切板中
            clipboard.setContents(selection, null);
            //将选中文本start到end之间的内容替换为空白""
            WBY.replaceRange("", WBY.getSelectionStart(), WBY.getSelectionEnd());
        });
        //实现删除文本按钮的功能
        x8.addActionListener(e -> {
            //将选中文本start到end之间的内容替换为空白
            WBY.replaceRange("", WBY.getSelectionStart(), WBY.getSelectionEnd());
        });
        //实现字体变大的功能
        x9.addActionListener(e -> {
            WBY.setFont(new Font("", Font.BOLD, 40));
        });
        //实现字体变中等大小的功能
        x10.addActionListener(e -> {
            WBY.setFont(new Font("", Font.BOLD, 30));
        });
        //实现字体变小的功能
        x11.addActionListener(e -> {
            WBY.setFont(new Font("", Font.BOLD, 20));
        });
        //实现字体颜色变红的功能
        x12.addActionListener(e -> {
            WBY.setForeground(Color.RED);
        });
        //实现字体颜色变绿的功能
        x13.addActionListener(e -> {
            WBY.setForeground(Color.GREEN);
        });
        //实现字体颜色变蓝的功能
        x14.addActionListener(e -> {
            WBY.setForeground(Color.BLUE);
        });
        //实现字体颜色变黑的功能
        x15.addActionListener(e -> {
            WBY.setForeground(Color.BLACK);
        });
        //实现打开帮助文档的功能
        x16.addActionListener(e -> {
            //创建消息提示框,包括显示内容和弹窗标题
            JOptionPane.showMessageDialog(f,
                    "百度!", "提示", JOptionPane.INFORMATION_MESSAGE);
        });
        //分别给5个菜单添加各自的下拉菜单项
        m1.add(x1);
        m1.addSeparator();//两个菜单项之间添加界线
        m1.add(x2);
        m1.addSeparator();//两个菜单项之间添加界线
        m1.add(x3);
        m1.addSeparator();//两个菜单项之间添加界线
        m1.add(x4);
        m2.add(x5);
        m2.addSeparator();//两个菜单项之间添加界线
        m2.add(x6);
        m2.addSeparator();//两个菜单项之间添加界线
        m2.add(x7);
        m2.addSeparator();//两个菜单项之间添加界线
        m2.add(x8);
        m3.add(x9);
        m3.addSeparator();//两个菜单项之间添加界线
        m3.add(x10);
        m3.addSeparator();//两个菜单项之间添加界线
        m3.add(x11);
        m4.add(x12);
        m4.addSeparator();//两个菜单项之间添加界线
        m4.add(x13);
        m4.addSeparator();//两个菜单项之间添加界线
        m4.add(x14);
        m4.addSeparator();//两个菜单项之间添加界线
        m4.add(x15);
        m5.add(x16);
        //添加这5个菜单到菜单栏
        cdl.add(m1);
        cdl.add(m2);
        cdl.add(m3);
        cdl.add(m4);
        cdl.add(m5);
        //给窗体添加完善好的菜单栏
        f.setJMenuBar(cdl);
        //记事本设置为可见
        f.setVisible(true);
        //点击×号结束应用程序
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
}

图形界面如下:

 

登录

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

class DbUtil {
    static Connection conn = null;
    static Statement sm = null;
    static ResultSet rs = null;
    static String driver = "com.mysql.cj.jdbc.Driver";
    static String url = "jdbc:mysql://localhost:3306/testdatabase";
    static String username = "root";
    static String password = "mysql1234";

    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn =
                    DriverManager.getConnection(url, username, password);
            sm = conn.createStatement();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public static ResultSet getResult(String sql) {
        try {
            rs = sm.executeQuery(sql);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return rs;
    }
}

public class Work14_3 extends DbUtil {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGUI());

    }

    public static boolean checkByUnameAndPwd(String uname, String pwd) {
        String sql = "select * from user where name='" + uname + "' and password='" + pwd + "' ";
        ResultSet rs = getResult(sql);
        boolean flag = false;
        try {
            while (rs.next()) {
                flag = true;
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return flag;
    }

    public static void createAndShowGUI() {
        final int[] count = {0};

        JFrame f = new JFrame();
        f.setTitle("登录");
        f.setSize(210, 164);
        f.setLocationRelativeTo(null);
        f.setResizable(false);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        FlowLayout layout = new FlowLayout();
        layout.setVgap(12);
        f.setLayout(layout);
        JLabel lblUser = new JLabel("用户名:");
        JLabel lblPass = new JLabel("密    码:");
        JTextField txtUser = new JTextField(10);
        JPasswordField pwdPass = new JPasswordField(10);
        JPanel panel = new JPanel();
        layout = new FlowLayout();
        layout.setHgap(30);
        panel.setLayout(layout);
        JButton btnLogin = new JButton("登录");
        JButton btnExit = new JButton("退出");

        f.add(lblUser);
        f.add(txtUser);
        f.add(lblPass);
        f.add(pwdPass);
        panel.add(btnLogin);
        panel.add(btnExit);
        f.add(panel);

        btnLogin.addActionListener(new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {
                if (count[0] < 3) {
                    if (checkByUnameAndPwd(txtUser.getText(), new String(pwdPass.getPassword()))) {
                        JOptionPane.showMessageDialog(f, "欢迎登录");
                    } else {
                        JOptionPane.showMessageDialog(f, "用户名或密码错误!");
                        count[0]++;
                    }
                } else {
                    JOptionPane.showMessageDialog(f, "您已经输错三次,请稍后再试!");
                }
            }
        });

        btnExit.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(f, "欢迎下次再来!");
                System.exit(0);

            }
        });

    }
}

图形界面如下:

 对我我这种初学菜鸟挺难得。。。。不全部都是自己写出来的,看了不少代码。只能说,熟能生巧吧。。。可能过一段时间不练就忘完了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸡『』

最不值钱的便是钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值