2023民大22级电信Java 练习7 图形用户界面设计及事件响应

目录

前言

一、事件处理:简单计算器实现

问题描述:

代码实现:

材料引用:

感谢:

界面显示:

二、Student类及相应的图形用户界面

问题描述:

代码实现:

材料引用:

界面显示:

末尾


前言

根据题目要求完成各题   图形用户界面及事件响应的相关题,在自己的电脑运行正确、正常显示界面,完成事件处理,提交后出现错误不用管,也不用担心没分

环境:IDEA


一、事件处理:简单计算器实现

问题描述:

实现一个简单的计算器,前面是一个文本框(操作数1),后面是标签(操作符),再后面是一个文本框(操作数2),然后是一个"="按钮(JButton),最后是一个文本框(结果)

(1)实现按钮ActionEvent事件的处理,点击等号获取计算结果,并显示在最后一个文本框;

(2)实现第二个文本框的ActionEvent事件处理,在第二个文本框按回车,直接获得计算结果,并显示在最后一个文本框。(事件源为第二个文本框)

(3)实现运算符标签的MouseEvent事件的处理,点击标签,可以更换标签的运算符,比如:将加号改成减号,从而实现减法功能,点击等号按钮,实现减法运算,并将结果显示在第三个文本框中。(具体实现:实现mouseClicked()时,判断鼠标单击次数是否为除4余0、余1、余2、余3,比如余为1,则将运算符标签上的字符修改为”-”,从而实现减法运算)

代码实现:

//Calculator.java
package practice_7_1;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Calculator extends JFrame implements ActionListener, MouseListener,KeyListener {
    //设置全局变量以便于实现接口中的方法
    JButton btn;
    JTextField num1TextField,num2TextField,resultTextField;
    JLabel label;
    public Calculator() {
        super("Simple Calculator");
        Container c = this.getContentPane();
        c.setLayout(new FlowLayout());

        num1TextField = new JTextField(5);
        num2TextField = new JTextField(5);
        resultTextField = new JTextField(8);
        btn = new JButton("=");
        label = new JLabel("+");

        c.add(num1TextField);
        c.add(label);
        c.add(num2TextField);
        c.add(btn);
        c.add(resultTextField);

        btn.addActionListener(this);
        label.addMouseListener(this);
        num2TextField.addActionListener(this);
        //num2TextField.addKeyListener(this);


        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setSize(400,210);
        this.setLocationRelativeTo(null);//居中显示
        this.setVisible(true);


    }

    public static void main(String[] args) {
        new Calculator();
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btn||e.getSource() == num2TextField){
            calculate();
        }

    }

    private void calculate() {
        double a,b;
        a = Double.parseDouble(num1TextField.getText());
        b = Double.parseDouble(num2TextField.getText());
        switch (label.getText()){
            case "+": resultTextField.setText(String.valueOf(a+b));break;
            case "-":
                resultTextField.setText(String.valueOf(a-b));break;
            case "*":
                resultTextField.setText(String.valueOf(a*b));break;
            case "/":
                if (b==0){
                    JOptionPane.showMessageDialog(null,"The divisor is 0!","Input error", JOptionPane.INFORMATION_MESSAGE);
                    break;
                }
                resultTextField.setText(String.valueOf(a/b));
            default:break;
        }

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if (e.getClickCount()%4 == 1){
            label.setText("-");
        }
        if (e.getClickCount()%4==2){
            label.setText("*");
        }
        if (e.getClickCount()%4==3){
            label.setText("/");
        }
        if (e.getClickCount()%4==0){
            label.setText("+");
        }

    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }


    @Override
    //https://blog.csdn.net/lly1122334/article/details/96481184
    public void keyTyped(KeyEvent e) {
        if((char)e.getKeyChar()==KeyEvent.VK_ENTER) {
            calculate();
        }
    }

    @Override
    public void keyPressed(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}

材料引用:

文本框中响应回车键(KeyEvent):

(38条消息) Java文本框监听回车(KeyEvent事件)_java 键盘监听回车_XerCis的博客-CSDN博客 

感谢:

文本框响应回车用ActionListener监听代码更加简洁;多谢2203班 于宏嘉同学的分享

界面显示:

开始界面

 

从键盘输入数据点击“=”后界面

 

点击“+”后按回车后界面

 

二、Student类及相应的图形用户界面

问题描述:

设计一个Student类并编写代码,Student类的属性有姓名,出生年、月、日;自定义的方法:至少包括计算学生年龄的方法calAge()。编写一个GUI类,输入学生的姓名和出生年、月、日,由此创建这个Student对象,调用Student类的方法calAge(),计算出该学生的年龄,并将年龄显示在用户界面上。(大致界面如下,是否加背景、是否使用滚动窗格自行决定。)

 

 

代码实现:

//Student.java
package practice_7_2;

import java.util.Calendar;

public class Student {
    private String name;
    private int year,month,day;
    //获取当前年份
    //https://blog.csdn.net/weixin_41905537/article/details/105880913
    //获取当前时间
    Calendar calendar = Calendar.getInstance();
    public int calAge(){
        return calendar.get(Calendar.YEAR)-year;
    }

    public Student(int year) {
        this.year = year;
    }

}
//CalAge.java
package practice_7_2;

//import com.sun.org.apache.bcel.internal.generic.LAND;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class CalAge extends JFrame implements ActionListener{
    JButton okBtn,cancelBtn;
    Student student ;
    JTextField yearTextField,nameTextF,monthTextF,dayTextF;
    //滚动窗格
    //https://blog.csdn.net/weixin_42247720/article/details/80480760
    //https://blog.csdn.net/qq_43464558/article/details/113516507
    JScrollPane jsp1,jsp2;
    JTextArea jTextArea;
    //设置背景图片
    //https://blog.csdn.net/he13733625052/article/details/90177674#:~:text=1.%E5%9C%A8JAVA%E6%96%87%E4%BB%B6%E4%B8%AD%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AAFolder%EF%BC%88%E6%96%87%E4%BB%B6%E5%A4%B9%EF%BC%89%EF%BC%8C%E6%8A%8A%E5%87%86%E5%A4%87%E5%A5%BD%E7%9A%84%E5%9B%BE%E7%89%87%E5%A4%8D%E5%88%B6%E7%B2%98%E8%B4%B4%E8%BF%9B%E5%8E%BB%EF%BC%8C%E5%9C%A8%E5%87%BA%E7%8E%B0%E5%A6%82%E4%B8%8B%E5%9B%BE%E7%89%87%E6%97%B6%E7%82%B9%E5%87%BBok%EF%BC%8C%E6%9C%80%E5%A5%BD%E6%8A%8A%E5%9B%BE%E7%89%87%E5%90%8D%E5%AD%97%E4%BF%AE%E6%94%B9%E7%9A%84%E7%AE%80%E5%8D%95%E4%B8%80%E7%82%B9%E3%80%82%202.%E7%AA%97%E5%8F%A3%E5%B8%83%E5%B1%80%E4%B8%BA%E5%88%86%E5%B1%82%E7%BD%91%E6%A0%BC%E3%80%82,3.%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%A0%87%E7%AD%BE%EF%BC%88JLabel%EF%BC%89%EF%BC%8C%E6%8A%8A%E5%9B%BE%E7%89%87%E6%94%BE%E5%85%A5%E6%A0%87%E7%AD%BE%E4%B8%AD%E3%80%82%204.%E8%AE%BE%E7%BD%AE%E6%8C%89%E9%92%AE%E7%AD%89%E7%BB%84%E4%BB%B6%E9%80%8F%E6%98%8E%E3%80%82
    //https://blog.csdn.net/m0_54202580/article/details/121325073
    //ImageIcon imageIcon;
    //JLabel backgroundLabel;


    public CalAge() {
        super("calculate Student's age");
        Container c = this.getContentPane();
        c.setLayout(new GridLayout(4, 1));

        JPanel panel1 = new JPanel(new FlowLayout());
        JPanel panel2 = new JPanel(new FlowLayout());
        JPanel panel3 = new JPanel(new FlowLayout());
        JPanel panel4 = new JPanel(new FlowLayout());

        nameTextF = new JTextField(10);
        yearTextField = new JTextField(8);
        monthTextF = new JTextField(3);
        dayTextF = new JTextField(3);
        JLabel nameLabel = new JLabel("name");
        JLabel dateLabel = new JLabel("bornDate");
        JLabel yearLabel = new JLabel("year");
        JLabel monthLabel = new JLabel("month");
        JLabel dayLabel = new JLabel("day");
        JLabel ageLabel = new JLabel("age of the student");
        okBtn = new JButton("OK");
        cancelBtn = new JButton("cancel");
        jTextArea = new JTextArea(10,10);
        //JScrollPane 水平垂直设置
        //https://blog.csdn.net/chaozhidan/article/details/8489665
        jsp1 = new JScrollPane(jTextArea, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        jsp2 = new JScrollPane(jTextArea, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        //imageIcon = new ImageIcon("background.png");

        //backgroundLabel = new JLabel(imageIcon);
        //backgroundLabel.setBounds(0,0,imageIcon.getIconWidth(),imageIcon.getIconHeight());

        //c.add(backgroundLabel);
        panel1.add(nameLabel);
        panel1.add(nameTextF);
        panel2.add(dateLabel);
        panel2.add(yearTextField);
        panel2.add(yearLabel);
        panel2.add(monthTextF);
        panel2.add(monthLabel);
        panel2.add(dayTextF);
        panel2.add(dayLabel);
        panel3.add(ageLabel);
        panel3.add(jsp1);
        panel3.add(jsp2);
        panel4.add(okBtn);
        panel4.add(cancelBtn);

        c.add(panel1);
        c.add(panel2);
        c.add(panel3);
        c.add(panel4);

        okBtn.addActionListener(this);
        cancelBtn.addActionListener(this);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(500, 500);
        //居中显示
        //https://blog.csdn.net/czbqoo01/article/details/69927335
        setLocationRelativeTo(null);
        this.setVisible(true);


    }

    public static void main(String[] args) {
        new CalAge();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == okBtn){
            int year = Integer.parseInt(yearTextField.getText());
            student = new Student(year);
            jTextArea.setText(String.valueOf(student.calAge()));
        }
        if (e.getSource() == cancelBtn){
            nameTextF.setText("");
            yearTextField.setText("");
            monthTextF.setText("");
            dayTextF.setText("");
        }
    }
}

材料引用:

获取当前年份:

(38条消息) java获取当前年份、月份和日期字符串等_java获取当前时间字符串_Joseph9499的博客-CSDN博客

滚动窗格:

1、

(38条消息) JavaGUI——swing组件基础(四)下拉框/列表框/滚动窗格组件_狮子座的程序员的博客-CSDN博客

2、



(38条消息) javaGUI学习27:AWT-滚动:滚动条与滚动框_awt 滚动布局_八十岁老将的博客-CSDN博客

设置背景图片:

1、(38条消息) Java界面:java设置背景图片_java中添加背景图片_风不会停息_H的博客-CSDN博客

2、

(38条消息) Java GUI设置背景图片的方法_gui界面背景_果粒程炸串酱的博客-CSDN博客

JScorllPane水平 竖直设置:

(38条消息) JScrollPane水平,垂直条设置_chaozhidan的博客-CSDN博客

GUI居中显示:

(38条消息) JFrame居中显示的两种方法_jframe居中显示方法_ReaderWriter的博客-CSDN博客

界面显示:

开始界面

 

从键盘输入后点击“OK”

 

点击“cancel”

 

 



末尾

学习时间较短,本文仅供学习交流。

欢迎斧正文中的不足与分享宝贵建议!

感谢观看

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Qiming_Peng

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值