软件设计(实验三):经典软件体系结构风格(二)

实验目的: 

本实验旨在帮助学生理解和实现两种常见的软件体系结构风格:事件的隐式调用软件体系结构、层次软件体系结构。通过编写具体的代码,学生将能够掌握这两种风格的基本原理,并能够评估它们在不同场景下的适用性和优劣。

基于层次软件体系结构设计如下软件。

图2 用户图形界面

第一层:

为用户图形界面层:包括:JFrame、JPanel、JLabel、JTextArea、JComboBox

JComboBox中可选插入排序、冒泡排序;如上图2所示:

第二层:

为测试案例层,包括软件测试工程师所编写的测试案例:生成随机数、执行排序操作、获取运行时间;

第三层:

被测试软件层(排序算法)。

                            

实验要求:

1. 调试基于事件处理的隐式调用风格实例,并分析隐式调用的程序结构及事件处理过程。

2. 设计并实现基于层次结构的排序算法实例,在插入排序、冒泡排序的基础上,增加归并排序与快速排序;随机生成20个整数,在输出区域显示排序结果及运行时间。

代码:

第一层:

关于SwingUtilities.invokeLater:

SwingUtilities.invokeLater(Runnable doRun) 是 Java Swing 图形用户界面(GUI)工具包中的一个非常重要的方法。它用于在事件调度线程(Event Dispatching Thread,简称 EDT)上安排执行一个 Runnable 任务。EDT 是 Swing 框架中用于处理所有事件(如按键、鼠标点击等)和用户界面更新的线程。

在 Swing 应用程序中,所有与 GUI 相关的更新都应该在 EDT 上执行,以确保线程安全和界面的响应性。如果尝试从其他线程(即非 EDT 线程)更新 Swing 组件,可能会导致不可预测的行为,比如界面冻结、不更新或者抛出异常。

SwingUtilities.invokeLater(Runnable doRun) 方法的参数是一个实现了 Runnable 接口的对象,该接口定义了一个 run() 方法,其中包含了你希望在 EDT 上执行的代码。当你调用 invokeLater 方法时,你传递的 Runnable 对象(即包含了你想要在 EDT 上执行的代码的 run() 方法)会被排队,并尽快在 EDT 上执行,但不会立即执行,因为 EDT 可能正在处理其他事件。

为什么通常推荐使用SwingUtilities.invokeLater的原因:

  1. 线程安全:Swing组件不是线程安全的。如果你从非EDT线程直接访问或修改Swing组件,可能会导致不可预测的行为,如界面更新不一致、组件不响应事件或抛出异常。

  2. 响应性:EDT负责处理所有的事件(如鼠标点击、键盘输入等)和界面更新。如果GUI的创建和初始化过程在主线程中执行,并且这些操作耗时较长,那么界面可能会在这段时间内无响应。

  3. 最佳实践:遵循Swing的最佳实践可以使你的代码更加健壮、可维护和可移植。

  4. 避免潜在的bug:即使你的应用程序在开发过程中没有表现出问题,但在不同的环境或配置下,不使用SwingUtilities.invokeLater可能会导致难以追踪的bug。

在你的例子中,如果SortingApp是一个继承自JFrame或包含Swing组件的类,并且setVisible(true)是用来显示窗口的,那么最好使用SwingUtilities.invokeLater来确保这一操作在EDT上执行。

如果你确定SortingApp的构造和setVisible(true)调用不会涉及任何耗时的操作,并且你的应用程序的其余部分(如果有的话)不会与GUI的创建和显示发生冲突,那么从技术上讲,你可以不使用SwingUtilities.invokeLater。然而,为了保持代码的健壮性和遵循Swing的最佳实践,建议始终使用它。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class SortingApp extends JFrame {private JComboBox<String> sortOptions;private JTextArea resultArea, inputArea;public SortingApp() {setTitle("排序演示");setSize(400, 300);setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JPanel panel = new JPanel();JPanel inputPanel = new JPanel();
//        panel.setLayout(new BorderLayout());panel.setLayout(new FlowLayout());String[] options = {"插入排序", "冒泡排序"};sortOptions = new JComboBox<>(options);JButton sortButton = new JButton("排序");resultArea = new JTextArea(3, 30);inputArea = new JTextArea(10, 30);
//自动换行inputArea.setLineWrap(true);inputArea.setWrapStyleWord(true);resultArea.setEditable(false);inputArea.setEditable(false);sortButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String selected = (String) sortOptions.getSelectedItem();SortTester tester = new SortTester();String result = "";if ("插入排序".equals(selected)) {result = tester.testInsertionSort();} else if ("冒泡排序".equals(selected)) {result = tester.testBubbleSort();}resultArea.setText(result);
//将arry转成带分隔符的字符串 能够在testarea中输出int[] array = tester.array; // 假设tester.array已经被正确定义和初始化String separator = ", ";
// 首先,将int[]转换为String[]String[] stringArray = new String[array.length];for (int i = 0; i < array.length; i++) {stringArray[i] = String.valueOf(array[i]);}
// 然后,使用String.join()方法将String[]转换为一个字符串String resultArray = String.join(separator, stringArray);System.out.println(resultArray); // 输出类似: "1, 2, 3, ..."inputArea.setText(selected.toString()+":\n"+resultArray);}});panel.add(sortOptions);panel.add(sortButton);panel.add(resultArea);panel.add(new JScrollPane(inputArea));add(panel);}public static void main(String[] args) {SwingUtilities.invokeLater(() -> {SortingApp app = new SortingApp();app.setVisible(true);});}
}

第二层:

import java.util.Random;public class SortTester {private static final int ARRAY_SIZE = 100;public String testInsertionSort() {int[] array = generateRandomArray(ARRAY_SIZE);long startTime = System.nanoTime();SortImp sortImp = new SortImp();sortImp.insertionSort(array);long endTime = System.nanoTime();return "插入排序完成。耗时:" + (endTime - startTime) + " 纳秒";}public String testBubbleSort() {int[] array = generateRandomArray(ARRAY_SIZE);long startTime = System.nanoTime();SortImp sortImp = new SortImp();sortImp.bubbleSort(array);long endTime = System.nanoTime();return "冒泡排序完成。耗时:" + (endTime - startTime) + " 纳秒";}private int[] generateRandomArray(int size) {Random rand = new Random();int[] array = new int[size];for (int i = 0; i < size; i++) {array[i] = rand.nextInt(1000);}return array;}}

第三层:

public class SortImp {// 插入排序实现public void insertionSort(int[] array) {for (int i = 1; i < array.length; i++) {int key = array[i];int j = i - 1;while (j >= 0 && array[j] > key) {array[j + 1] = array[j];j = j - 1;}array[j + 1] = key;}}// 冒泡排序实现public void bubbleSort(int[] array) {for (int i = 0; i < array.length - 1; i++) {for (int j = 0; j < array.length - i - 1; j++) {if (array[j] > array[j + 1]) {int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}}}
}

结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1550638.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

string类的使用(上)

目录 1.string类的概念 2.string的构造函数&#xff08;实现初始化&#xff09; 3.对string类容量获取和操作 4.string类对象的访问和遍历 4.1operator[] 4.2begin和end 4.3 rbegin 和 rend 4.4迭代器分类 4.5范围for&#xff08;自动实现遍历&#xff09; 5.string类…

http请求过程 part-2

http请求过程 http应用层 实体 实体分为实体首部和实体主体&#xff0c;实体首部是用来描述主体的 实体部分是可选的&#xff0c;它被用来运送请求或者响应的数据 传输层-TCP HTTP连接是建立在TCP连接的基础上 以流形式通过一条已经打开的TCP连接&#xff0c;按顺序进行…

next 从入门到精通

next 从入门到精通 相关链接 演示地址 演示地址 源码地址 源码地址 获取更多 获取更多 hello 大家好&#xff0c;我是 数擎科技&#xff0c;今天来跟大家聊聊 Next.js 如果你遇到任何问题&#xff0c;欢迎联系我 m-xiaozhicloud 什么是 Next.js Next.js 是一个基于 Reac…

27 C 语言标准库 <stdio.h> 中的两个字符串函数:sprintf、sscanf,不同编码方式的中文字符长度

目录 1 sprintf 1.1 函数原型 1.2 功能说明 1.3 案例演示 1.4 注意事项 2 sscanf 2.1 函数原型 2.2 功能说明 2.3 案例演示 2.4 使用 %s 解析字符串的易错点 2.4.1 空白符问题 2.4.2 顺序问题 2.4.3 中文字符长度问题 2.5 注意事项 1 sprintf 1.1 函数原型 spri…

求恰好为k 的区间数量(滑动窗口进阶版)

前言&#xff1a;之前做的滑动窗口都是可以直接一遍过&#xff0c;然后每次右边确定了以后&#xff0c;左边不断缩小寻找最优解 但是这个题目呢我们不仅要保证我们的辅音字母的个数恰好为k&#xff0c;其他元音字母的个数只要每个都出现了就行&#xff0c;这个就导致我们不能用…

【IEEE PDF eXpress】格式不对

目录 一、问题二、解决方法 一、问题 word的文档&#xff0c;用IEEE PDF eXpress网站生成pdf后&#xff0c;提交论文出现错误&#xff1a; Document validation failed due to the following errors: Content exceeds IEEE template margins for its format (Page 1:Bottom).…

Java_TestNg

TestNg 前言支持特性 使用步骤1.引入库 常用注解Test注解BeforeSuite AfterSuiteAfterClass BeforeClassAfterTest BeforeTestAfterGroups BeforeGroupsBeforeMethod AfterMethodDataProviderFactoryListenersPatameters断言相等 不相等true/falsenull / !nullequals / !equals…

Leetcode 887. 鸡蛋掉落

1.题目基本信息 1.1.题目描述 给你 k 枚相同的鸡蛋&#xff0c;并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。 已知存在楼层 f &#xff0c;满足 0 < f < n &#xff0c;任何从 高于 f 的楼层落下的鸡蛋都会碎&#xff0c;从 f 楼层或比它低的楼层落下的鸡蛋都…

AIGC时代,大模型微调如何发挥最大作用?

人工智能的快速发展推动了大模型的广泛应用&#xff0c;它们在语言、视觉、语音等领域的应用效果已经越来越好。但是&#xff0c;训练一个大模型需要巨大的计算资源和时间&#xff0c;为了减少这种资源的浪费&#xff0c;微调已经成为一种流行的技术。微调是指在预训练模型的基…

DVWA | File Inclusion(文件包含)渗透测试

概念&#xff1a; 漏洞产生原因&#xff1a; 主要是由于开发人员没有对用户输入的文件路径进行严格的过滤和验证。例如&#xff0c;如果一个 Web 应用程序接受用户输入的文件路径&#xff0c;然后使用这个路径进行文件包含&#xff0c;而没有对用户输入进行任何检查&#xff0c…

【笔记】数据结构12

文章目录 2013年408应用题41方法一方法二 看到的社区的一个知识总结&#xff0c;这里记录一下。 知识点汇总 2013年408应用题41 解决方法&#xff1a; 方法一 &#xff08;1&#xff09;算法思想 算法的策略是从前向后扫描数组元素&#xff0c;标记出一个可能成为主元素的元…

【YOLO目标检测二维码数据集】共3112张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式&#xff1a;YOLO格式 图片数量&#xff1a;3112 标注数量(txt文件个数)&#xff1a;3112 标注类别数&#xff1a;1 标注类别名称&#xff1a;qrcode 数据集下载&#xff1a;二维码数据集 图片示例 数据集图片&#xff1a; 数据集…

yolov8/9/10模型在垃圾分类检测中的应用【代码+数据集+python环境+GUI系统】

yolov8/9/10模型在垃圾分类检测中的应用【代码数据集python环境GUI系统】 yolov8/9/10模型在垃圾分类检测中的应用【代码数据集python环境GUI系统】 背景意义 随着计算机视觉技术和深度学习算法的快速发展&#xff0c;图像识别、对象检测、图像分割等技术在各个领域得到了广泛…

C++类和对象(下) 初始化列表 、static成员、友元、内部类等等

1.再探构造函数 之前使用构造函数时都是在函数体内初始化成员变量&#xff0c;还有一种构造函数的用法&#xff0c;叫做初始化列表&#xff1b;那么怎么使用呢&#xff1f; 使用方法用冒号开始(" : ")要写多个就用逗号(" , ")隔开数据成队列每个成员变量后…

谷歌收录批量查询,如何批量查询谷歌收录以及提交网站进行收录的方法

在SEO优化过程中&#xff0c;了解并监控网站在谷歌搜索引擎中的收录情况至关重要。本文将详细介绍如何批量查询谷歌收录以及提交网站进行收录的方法&#xff0c;帮助网站管理员和SEO专家更有效地管理和优化网站。 一、谷歌收录批量查询方法 1.使用搜索引擎的site指令 …

前端考核总结

目录 JavaScript的基本数据类型有哪些&#xff1f;JavaScript中数据类型的检测方法JavaScript如何判断对象中的属性存在自身还是原型链上flex布局HTML5新标签Vue的基本概念Vue生命周期JavaScript中闭包的基本概念防抖节流双等号与三等号的区别显式转换 JavaScript的基本数据类型…

fastadmin搜索刷新列表,怎么限制用户频繁点击?

文章目录 fastadmin搜索刷新列表&#xff0c;怎么限制用户频繁点击&#xff1f;解决方案fastadmin事件方法实现完结 fastadmin搜索刷新列表&#xff0c;怎么限制用户频繁点击&#xff1f; fastadmin目前有个很致命的问题&#xff0c;就是用户可以频繁的点击搜索等按钮&#xf…

Qt --- 界面优化 --- QSS和绘图API

界面优化 》美化 一个程序的界面是否好看&#xff0c;是否重要呢。 有些面向专业领域的程序&#xff0c;界面好看与否&#xff0c;不是看关键&#xff0c;更关键的是实际的效果。有些面向普通用户领域的程序&#xff0c;界面好看&#xff0c;还是很大的加分项。 界面优化 Qt…

奖金高达 110 万元,Spatial Joy 2024 全球 AR 应用开发大赛启动

今年是AR应用开发大赛第三届&#xff0c;恰逢Rokid成立十周年&#xff0c;我们推出全新的大赛品牌“Spatial Joy”&#xff0c;引领开发者享受开发乐趣&#xff0c;为其打造充满挑战和惊喜的开发之旅&#xff0c;逐渐成为空间计算时代全球最大AR应用开发大赛。回顾大赛发展&…

PCB敷铜敷不了相同网络的线怎么办?

图片上的情况就是今天需要讲的内容&#xff0c;可以看出出来的线头是GND,敷的铜也是GND但是相同网络就是不能连在一起。 解释&#xff1a; 这是因为我们敷铜的时候属性选的是连接相同的net,如图所示&#xff1a; 解决办法&#xff1a; 只需要设置改为相同的Object就可以了&…