中南林业科技大学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 演示


相关文章
|
15天前
|
存储 IDE Java
漂亮不是梦!Java Swing美化攻略
Java Swing 是一个为 Java 设计的 GUI 工具包,提供文本框、按钮等组件。尽管其外观可定制,通过 Look and Feel(LAF)机制改变应用风格,如 Darcula 和 FlatLaf,但现已淡出主流视野,主要应用于 IDE 领域,如 IntelliJ IDEA 和 Eclipse。相比其他 GUI 框架,Swing 的发展前景有限。
37 1
|
3月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
3月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
164 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
3月前
|
Java 数据安全/隐私保护 容器
java当中组件和窗口的相容问题(里面包含了这些方法的作用)
Java窗口和组件的布局指南,教你如何打造一个既美观又实用的GUI界面。
39 0
|
3月前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
41 0
|
5月前
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
|
5月前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
|
5月前
|
消息中间件 Java Kafka
【Azure 事件中心】在微软云中国区 (Mooncake) 上实验以Apache Kafka协议方式发送/接受Event Hubs消息 (Java版)
【Azure 事件中心】在微软云中国区 (Mooncake) 上实验以Apache Kafka协议方式发送/接受Event Hubs消息 (Java版)
122 1
|
5月前
|
安全 Java API
|
5月前
|
存储 算法 前端开发
JVM架构与主要组件:了解Java程序的运行环境
JVM的架构设计非常精妙,它确保了Java程序的跨平台性和高效执行。通过了解JVM的各个组件,我们可以更好地理解Java程序的运行机制,这对于编写高效且稳定的Java应用程序至关重要。
64 3