中南林业科技大学Java实验报告十一:Swing组件

简介: 中南林业科技大学Java实验报告十一:Swing组件

实验11 Swing组件

11.1 实验目的

  1. 了解Swing组件。
  2. 熟练掌握Swing组件的使用方法。

11.2 实验内容

实现一个可以进行两个数加减乘除的计算器。有两个输入框用以输入数字,屏幕有四个按钮分别为+、-、×、÷,在界面中显示结果。以加法为例如果输入的数字为1和3,则在界面中的输出结果为:1+3=4。在输入时要进行输入检查和异常处理;如果用户未输入两个数,要提示请输入数据,可以用文本提示也可以弹出对话框提示。(注意所有组件采用Swing的组件,控件可以根据需求和设计的不同增加)

11.2.1 代码

11.2.1.1 ScreenUtils类

import java.awt.*;
public class ScreenUtils {
    /*
        获取当前电脑屏幕的宽度
     */
    public static int getScreenWidth(){
        return Toolkit.getDefaultToolkit().getScreenSize().width;
    }
    /*
        获取当前电脑屏幕的高度
     */
    public static int getScreenHeight(){
        return Toolkit.getDefaultToolkit().getScreenSize().height;
    }
}

11.2.1.2 CalView类

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CalView {
    JFrame jf = new JFrame("简易计算器");
    /**
     * 定义窗口的宽度
     */
    final int WIDTH = 600;
    /**
     * 定义窗口的高度
     */
    final int HEIGHT = 350;
    /**
     * 计算符号,计算值,计算结果
     */
    String method;
    double calValue1;
    double calValue2;
    double result;
    JTextField valueField1;
    JTextField valueField2;
    JTextField resField;
    /**
     * 组装视图
     */
    public void init() {
        //设置关闭窗口为结束程序
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗口相关的属性
        jf.setBounds((ScreenUtils.getScreenWidth() - WIDTH) / 2, (ScreenUtils.getScreenHeight() - HEIGHT) / 2, WIDTH, HEIGHT);
        //设置窗口大小不可变
        jf.setResizable(false);
        /*
            组装 value1 和 text1
         */
        Box valueBox1 = Box.createHorizontalBox();
        JLabel valueLabel1 = new JLabel("value1");
        //设置为10个长度大小
        valueField1 = new JTextField(10);
        valueBox1.add(valueLabel1);
        //设置水平间隔为20px
        valueBox1.add(Box.createHorizontalStrut(20));
        valueBox1.add(valueField1);
        /*
            组装 value2 和 text2
         */
        Box valueBox2 = Box.createHorizontalBox();
        JLabel valueLabel2 = new JLabel("value2");
        //设置为10个长度大小
        valueField2 = new JTextField(10);
        valueBox2.add(valueLabel2);
        //设置水平间隔为20px
        valueBox2.add(Box.createHorizontalStrut(20));
        valueBox2.add(valueField2);
        /*
            组装 valueBox1 和 valueBox2
         */
        Box valueBox12 = Box.createHorizontalBox();
        valueBox12.add(valueBox1);
        //设置水平间隔为40px
        valueBox12.add(Box.createHorizontalStrut(40));
        valueBox12.add(valueBox2);
        /*
           组装计算方式
         */
        Box methodBox = Box.createHorizontalBox();
        JLabel methodLabel = new JLabel("计算方式");
        JRadioButton addButton = new JRadioButton("+");
        JRadioButton subButton = new JRadioButton("-");
        JRadioButton mulButton = new JRadioButton("×");
        JRadioButton divButton = new JRadioButton("÷");
        ActionListener actionListener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String actionCommand = e.getActionCommand();
                //得到当前选择的计算方式
                method = actionCommand;
            }
        };
        addButton.addActionListener(actionListener);
        subButton.addActionListener(actionListener);
        mulButton.addActionListener(actionListener);
        divButton.addActionListener(actionListener);
        //添加到同一个按钮组,实现单选效果
        ButtonGroup buttonGroup = new ButtonGroup();
        buttonGroup.add(addButton);
        buttonGroup.add(subButton);
        buttonGroup.add(mulButton);
        buttonGroup.add(divButton);
        methodBox.add(methodLabel);
        methodBox.add(Box.createHorizontalStrut(30));
        methodBox.add(addButton);
        methodBox.add(Box.createHorizontalStrut(20));
        methodBox.add(subButton);
        methodBox.add(Box.createHorizontalStrut(20));
        methodBox.add(mulButton);
        methodBox.add(Box.createHorizontalStrut(20));
        methodBox.add(divButton);
        /*
         * 组装运算组件
         */
        JButton runButton = new JButton("开始运算");
        runButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //清空结果文本域
                resField.setText("");
                if ("".equals(valueField1.getText()) || "".equals(valueField2.getText())) {
                    //说明有文本为空
                    JOptionPane.showMessageDialog(jf, "请输入数据", "提醒", JOptionPane.WARNING_MESSAGE);
                    return;
                }
                try {
                    calValue1 = Double.parseDouble(valueField1.getText().trim());
                    calValue2 = Double.parseDouble(valueField2.getText().trim());
                } catch (NumberFormatException ex) {
                    JOptionPane.showMessageDialog(jf, "检测到非正常数据", "提醒", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                if (method == null) {
                    JOptionPane.showMessageDialog(jf, "请选择运算方式", "提醒", JOptionPane.WARNING_MESSAGE);
                    return;
                }
                switch (method) {
                    case "+":
                        result = calValue1 + calValue2;
                        break;
                    case "-":
                        result = calValue1 - calValue2;
                        break;
                    case "×":
                        result = calValue1 * calValue2;
                        break;
                    case "÷":
                        if (calValue2 == 0) {
                            JOptionPane.showMessageDialog(jf, "检测到非法运算(0作为分母)", "提醒", JOptionPane.ERROR_MESSAGE);
                            return;
                        }
                        result = calValue1 / calValue2;
                        break;
                }
                //在文本域中显示运算结果
                if(((result+"").matches(".*(\\.0)$"))){
                    resField.setText(valueField1.getText() + " " + method + " " + valueField2.getText() + " = " + (int)result);
                }else{
                    resField.setText(valueField1.getText() + " " + method + " " + valueField2.getText() + " = " + result);
                }
            }
        });
        Box runBox = Box.createHorizontalBox();
        runBox.add(runButton);
        /*
          组装计算结果
         */
        Box resBox = Box.createHorizontalBox();
        JLabel resLabel = new JLabel("计算结果");
        resField = new JTextField(40);
        resBox.add(resLabel);
        resBox.add(Box.createHorizontalStrut(30));
        resBox.add(resField);
        /*
         * 组装 valueBox12 methodBox resBox
         */
        Box viewBox = Box.createVerticalBox();
        viewBox.add(Box.createVerticalStrut(60));
        viewBox.add(valueBox12);
        viewBox.add(Box.createVerticalStrut(50));
        viewBox.add(methodBox);
        viewBox.add(Box.createVerticalStrut(50));
        viewBox.add(runBox);
        viewBox.add(Box.createVerticalStrut(50));
        viewBox.add(resBox);
        /*
         * 组装 viewBox 到面板
         */
        JPanel viewPanel = new JPanel();
        //设置背景颜色为青蓝色
        viewPanel.setBackground(new Color(153, 255, 255));
        //为panel设置边框 创建凸起的斜边框,分别设置四条边的颜色
        viewPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.RED, Color.GREEN, Color.BLUE, Color.GRAY));
        viewPanel.add(viewBox);
        jf.add(viewPanel);
        //显示窗口可见
        jf.setVisible(true);
    }
}

11.2.1.3 CalApplication类

/**
 *主启动类
 */
public class CalApplication {
    public static void main(String[] args) {
        new CalView().init();
    }
}

11.2.2 演示


相关文章
|
2月前
|
Java 数据安全/隐私保护 索引
(Java)Java里JFrame窗体的基本操作(组件篇-3)
回顾 说过了下拉框和下拉列表,本篇内容将了解滚动面板和各类输入框 什么是组件? 如果不熟悉组件,可以将组件看作是某个Form表单中的表单元素,组件可以完善JFrame窗口的布局,以及一些功能; 本篇内容中所有的组件所用到的类全都来自于javax.swing这个包中,记得引入; 另:在使用组件前,请先将窗体中的内容类给实例化出来进行操作,代码如下: Container c = getContentPane(); JScollPane JScollPane类,说的就是滚动面板。它不同于其他组件,它是一个容器,
83 1
|
2月前
|
Java 索引 容器
(Java)Java里JFrame窗体的基本操作(组件篇-2)
回顾 这算是JFrame窗体基本操作的组件第二篇了,上一篇说过了单选框,复选框,按钮。 在这一篇中,我会说明下拉框和列表框 什么是组件? 自行百度:java中JFrame窗体里的组件是什么? 名字都给你想好了 ( :I ) JComBox下拉框 JComBox类,就是下拉框,实例化出来后,要填写泛型<>,添加是什么数据类型的内容,泛型中就写上该数据类型; JComboBox<?> combox = new JComboBox<>(); 以下实例化下拉框的时候我泛型写的全
89 0
|
2月前
|
Java 容器
(Java)Java里JFrame窗体的基础操作(组件-1)
如果不熟悉组件,可以将组件看作是某个Form表单中的表单元素,当然这只是在不熟悉组件的前提下。如果深入了解了组件,那么它有着非常多的组件,这些组件可以完善JFrame窗口的布局,以及一些功能; 本篇内容中所有的组件所用到的类全都来自于javax.swing这个包中,记得引入
63 0
|
4月前
|
消息中间件 Java Kafka
Java 事件驱动架构设计实战与 Kafka 生态系统组件实操全流程指南
本指南详解Java事件驱动架构与Kafka生态实操,涵盖环境搭建、事件模型定义、生产者与消费者实现、事件测试及高级特性,助你快速构建高可扩展分布式系统。
250 7
|
6月前
|
Java 数据库连接 数据库
Java 组件详细使用方法与封装实战指南
本指南详解Java核心组件使用与封装技巧,涵盖跨平台开发、面向对象编程、多线程、数据库操作等关键内容,并提供工具类、连接池、异常及响应结果的封装方法。结合Spring框架、MyBatis、Spring Boot等主流技术,助你掌握高质量Java组件设计与开发实践。
207 2
|
6月前
|
资源调度 安全 Java
Java 大数据在智能教育在线实验室设备管理与实验资源优化配置中的应用实践
本文探讨Java大数据技术在智能教育在线实验室设备管理与资源优化中的应用。通过统一接入异构设备、构建四层实时处理管道及安全防护双体系,显著提升设备利用率与实验效率。某“双一流”高校实践显示,设备利用率从41%升至89%,等待时间缩短78%。该方案降低管理成本,为教育数字化转型提供技术支持。
166 1
|
6月前
|
消息中间件 机器学习/深度学习 Java
java 最新技术驱动的智能教育在线实验室设备管理与实验资源优化实操指南
这是一份基于最新技术的智能教育在线实验室设备管理与实验资源优化的实操指南,涵盖系统搭建、核心功能实现及优化策略。采用Flink实时处理、Kafka消息队列、Elasticsearch搜索分析和Redis缓存等技术栈,结合强化学习动态优化资源调度。指南详细描述了开发环境准备、基础组件部署、数据采集与处理、模型训练、API服务集成及性能调优步骤,支持高并发设备接入与低延迟处理,满足教育机构数字化转型需求。代码已提供下载链接,助力快速构建智能化实验室管理系统。
177 44
|
12月前
|
存储 IDE Java
漂亮不是梦!Java Swing美化攻略
Java Swing 是一个为 Java 设计的 GUI 工具包,提供文本框、按钮等组件。尽管其外观可定制,通过 Look and Feel(LAF)机制改变应用风格,如 Darcula 和 FlatLaf,但现已淡出主流视野,主要应用于 IDE 领域,如 IntelliJ IDEA 和 Eclipse。相比其他 GUI 框架,Swing 的发展前景有限。
444 1
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
844 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题