[Day29] CH13:画出你的藏宝图——事件处理(下)

接续昨天的程序,增加事件监听者至 BMI 类别。

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JOptionPane;

public class BMI2 extends JFrame{
    private final JLabel label1, label2, label3;
    private final JTextField textField, textField2;
    private final JButton btn;

    public BMI2(){
        super("计算 BMI");
        super.setLayout(null);

        label1 = new JLabel("请输入体重(公斤):");
        label1.setBounds(70, 50, 150, 20);
        add(label1);

        textField = new JTextField("0");
        textField.setBounds(230, 50, 100, 20);
        add(textField);

        label2 = new JLabel("请输入身高(公尺):");
        label2.setBounds(70, 100, 150, 20);
        add(label2);

        textField2 = new JTextField("0");
        textField2.setBounds(230, 100, 100, 20);
        add(textField2);

        btn = new JButton("计算");
        btn.setBounds(70, 150, 260, 20);
        add(btn);

        ButtonHandler handler = new ButtonHandler();
        btn.addActionListener(handler);

        label3 = new JLabel("BMI:");
        label3.setBounds(150, 200, 100, 20);
        add(label3);
    }

    private class ButtonHandler implements ActionListener{
        
        @Override
        public void actionPerformed(ActionEvent event){
            double weight = 0, height = 0, bmi = 0;
            try{
                weight = Double.parseDouble(textField.getText());   //取得文字框文字
                height = Double.parseDouble(textField2.getText());
                bmi = weight / (height * height);
                label3.setText("BMI:" + bmi);
            }catch(Exception e){
                JOptionPane.showMessageDialog(null, "请输入数字", "输入错误", JOptionPane.ERROR_MESSAGE);
            }
        }
    }
}
import javax.swing.JFrame;

public class CalculateBMI2 {
    public static void main(String[] args){
        BMI2 bmi = new BMI2();
        bmi.setSize(400, 300);   //设定宽,长
        bmi.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    //设定预设的关闭视窗         
        bmi.setVisible(true);    //视窗预设是不可见的
    }
}

我们可以看到 JButton 会产生任何 ActionListener 物件能够处里的 ActionEvent。建立一个 private 内层类别 ButtonHandler 的物件,再使用 addActionListener 将之注册为每个 JButton 的事件处理常式。 ButtonHandler 类别宣告了 actionPerformed,取得两个 JTextField 的文字,经过运算後将 BMI 呈现出来。若是输入不为数字,则跳出警告框提示。

除了 JButton 外,昨天还有提到像是 JCheckBox、JComboBox、JList 等都可以做为事件来源者,还记得我们前几天写的猜数字游戏吗?也可以试试看把它变成可以互动的游戏视窗,似乎看起来就更专业了!

用了三天的时间简单介绍了图形使用者介面,相关的内容还有非常多,鼓励大家可以多多尝试,对 Swing 多加了解。

这是这 30 天教学的最後一个单元了,不知道大家是不是对 Java 有一定的了解了,明天最後一天,一起来回顾学到了些什麽吧!


<<:  用React刻自己的投资Dashboard Day14 - 解决重复发送API请求的问题

>>:  【15】图片标准化 [0,1] 与 [-1,+1] 的差别实验

Day27:【技术篇】Webpack5 - Webpack 之运作流程

一、前言   搭配上一篇文章有提到 Webpack 之运作阶段,接下来需要了解在每个阶段又是如何运作...

Windows Server 安装 MySQL Community 免费社群版

在过去 MySQL 是一款免费开源的关联式资料库,在众多的中小型专案中做为资料库使用,在 2009 ...

[DAY25] Boxenn 小结

将几篇 Boxenn 相关文章整理成分类目录(范例 GitHub repository 建置中,完成...

Day 10 CSS <元素显示模式>

1. 什麽是元素显示模式 元素显示模式就是元素(标签)以什麽方式进行显示 作用 : 网页的标签非常多...

假名数据(Pseudonymized data)

-化名(Pseudonymization) 假名(Pseudonymized)数据可以通过添加信息...