【老白学 Java】项目演练 - Quizzes #2

项目演练 - Quizzes #2

码老白
文章来源:《Head First Java》修炼感悟。

上一篇文章老白仔细分析了 Quizzes 的类结构,本文接上一章继续对功能模块逐步完善。 整个程序没有复杂的算法,仅仅用到了一些基础知识,如果大家已经了解了这部分内容请无视,可以直接选择下一章。

QuizCardEditor 代码结构

为便于参考,QuizCardEditor 的类结构放到开头,接下来将按照顺序来逐一实现功能模块的具体代码。 请重新预览一下这个类的结构:

/*** 文件:QuizCardEditor.java* 描述:编辑题目和答案的GUI类,允许用户自定义数据然后保存在文件中。*/
public class QuizCardEditor {public static void main(String[] args) {// TODO:}public void init() {// TODO:}private class NewCardListener implements ActionListener {public void actionPerformed(ActionEvent e) {// TODO:}}private class NextCardListener implements ActionListener {public void actionPerformed(ActionEvent e) {// TODO:}}private class SaveCardListener implements ActionListener {public void actionPerformed(ActionEvent e) {// TODO:}}private void save(File file) {// TODO:}private void clear() {// TODO:}
}

main()

程序从这里开始,请看代码:

// 新建应用对象,准备初始化
public static void main(String[] args) {new QuizCardEditor().init();
}

init()

main 首先会调用 init 方法,看起来代码很长,但都是 GUI 相关的代码。 这里可以创建工作界面、布局以及窗口一些必要的初始化设置。 关键代码都给出了详细注释,请看代码:

// 创建 GUI
public void init() {// 创建编辑区字体Font font = new Font("微软雅黑", Font.BOLD, 24);// 创建题目编辑区question = new JTextArea(6, 20);question.setWrapStyleWord(true);question.setLineWrap(true);question.setFont(font);// 创建答案编辑区answer = new JTextArea(6, 20);answer.setWrapStyleWord(true);answer.setLineWrap(true);answer.setFont(font);// 创建题目区滚动面板JScrollPane queScroller = new JScrollPane(question);queScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);queScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);// 创建答案区滚动面板JScrollPane ansScroller = new JScrollPane(answer);ansScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);ansScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);// 创建编辑区标签JLabel queLabel = new JLabel("编辑题目:");JLabel ansLabel = new JLabel("编辑答案:");// 创建三个按钮并注册按钮事件JButton nextButton = new JButton("下一个");nextButton.addActionListener(new NextCardListener());JButton newButton = new JButton("新建");newButton.addActionListener(new NewCardListener());JButton saveButton = new JButton("保存");saveButton.addActionListener(new SaveCardListener());// 创建组件容器面板,把它们添加进来JPanel mainPanel = new JPanel();mainPanel.add(queLabel);mainPanel.add(queScroller);mainPanel.add(ansLabel);mainPanel.add(ansScroller);mainPanel.add(newButton);mainPanel.add(nextButton);mainPanel.add(saveButton);// 创建并显示窗口frame = new JFrame("答题卡编辑器 v1.0");frame.getContentPane().add(BorderLayout.CENTER, mainPanel);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setLocationRelativeTo(null);frame.setSize(550, 600);frame.setVisible(true);
}

NewCardListener 的事件处理

这是一个内部类,负责监听「新建」按钮的点击事件,提供了回调方法actionPerformed() 对事件进行处理。 请看代码:

// 事件处理,清空卡片列表和编辑区内容
private class NewCardListener implements ActionListener {public void actionPerformed(ActionEvent e) {cards.clear();clear();}
}

SaveCardListener 的事件处理

这是一个内部类,负责监听「保存」按钮的点击事件,提供了回调方法 actionPerformed() 对事件进行处理。 请看代码:

// 事件处理,根据编辑内容生成卡片并保存在卡片列表中
// 然后调用系统存盘对话框,写入文本数据后保存在指定目录下
private class SaveCardListener implements ActionListener {public void actionPerformed(ActionEvent e) {// 新建卡片数据QuizCard card = new QuizCard(question.getText(), answer.getText());cards.add(card);// 打开保存对话框JFileChooser fileSave = new JFileChooser();fileSave.showSaveDialog(frame);// 写入文件save(fileSave.getSelectedFile());}
}

NextCardListener 的事件处理

这是一个内部类,负责监听「下一个」按钮的点击事件,提供了回调方法 actionPerformed() 对事件进行处理。 请看代码:

// 根据编辑区内容生成新卡片并保存在列表中,然后清空编辑区
private class NextCardListener implements ActionListener {public void actionPerformed(ActionEvent e) {QuizCard card = new QuizCard(question.getText(), answer.getText());cards.add(card);clear();}
}

save()

该类用于写入答题卡数据,保存为一个数据文件。 请看代码:

// 把编辑好的题目和答案,写入到指定的文件中
private void save(File file) {try {FileWriter fw = new FileWriter(file);BufferedWriter writer = new BufferedWriter(fw);for (QuizCard card : cards) {writer.write(card.getQuestion() + "/");writer.write(card.getAnswer() + "\n");}writer.close();} catch (IOException e) {System.out.println("couldn't write the cards out.");e.printStackTrace();}
}

clear()

该方法用作清除文本域中的内容,准备编辑下一条数据。 请看代码:

// 清除题目和答案文本域中的文本内容
private void clear() {question.setText("");answer.setText("");question.requestFocus();	// 获得输入焦点
}

编译、运行

这是打开工作界面时的样子:
工作界面
点击「保存」时的状态:
存盘对话框

界面比较简陋,不过完全够用,大家可以按照自己的审美进行修改。 接下来的一篇文章,我们继续实现卡片引擎的代码,请继续保持关注。


《 上一篇 项目演练 - Quizzes #1下一篇 项目演练 - Quizzes #3 》

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s的原理和,k8s的安装

k8s:管理容器集群k8s的组成和调用原理cluster集群:控制平面和node共同构成一个cluster服务调用流程ingress控制器:让外部用户访问集群内部的服务kubeprox转发pod的容器中Control plan控制平面组件:控制和管理多个node1.api server:支持使用提供的api创建…

Python常用函数总结——超全面超详细_python函数大全及详解

Python作为一种高级编程语言,拥有丰富的内置函数库,这些函数大大简化了编程任务。以下是Python常用函数的总结及详解(部分函数有所重复或归类,以展示其多样性和应用场景): 一、基础与数据类型相关 print(…

计算机网络 (33)传输控制协议TCP概述

一、定义与基本概念 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它工作在OSI模型的第四层,即传输层,为用户提供可靠的、有序的和无差错的数据传输服务。TCP协议与UDP协议是传输层的两大主要协议,但两者在设计上有明显的不同&…

JuiceFS 2024:开源与商业并进,迈向 AI 原生时代

即将过去的 2024 年,是 JuiceFS 开源版本推出的第 4 年,企业版的第 8 个年头。回顾过去这一年,JuiceFS 社区版依旧保持着快速成长的势头,GitHub 星标突破 11.1K,各项使用指标增长均超过 100%,其中文件系统总…

4、SDH为基础的多业务传送-MSTP

1、SDH(Synchronous Digital Hierarchy,同步数字体系) SDH 就像是一条超级高速公路,它的规则很严格,所有的车辆(数据信号)都要按照它规定的速度和车道(标准的传输体制)行…

初级前端面试题 - js

前言:众所周知,HTML,CSS,JS是学习前端所必备的。js的基础学好了,框架类的vue,react等都会接受的很快,因此js是前端很总要的一个部分,这篇文章将会结合面试题,对js的知识点进行总结 号外号外,这是…

linux的shell中自定义的分隔符怎么用

在 Shell 脚本中,自定义分隔符可以通过多种方式使用,特别是在处理文件或字符串时。常见的场景包括读取以特定字符分隔的文件、设置 IFS(内部字段分隔符)来分割字符串等。以下是几种常见方法及其示例: ### 1. 使用 IFS…

C#里使用libxl里演示输出日期和读取日期数据的例子

日期在EXCEL里也是一种复杂的数据处理, 为什么这样说呢? 因为日期显示,在世界各国里互不相同。 在许多西方国家,日期的表示顺序遵循“日-月-年”的规则,即“Day-Month-Year”,例如:12th January 2023。这种顺序在英语国家中普遍存在,如美国、英国、澳大利亚和加拿大…

使用 Maxwell 计算母线的电动势

三相短路事件的动力学 三相短路事件在电气系统中至关重要,因为三相之间的意外连接会导致电流大幅激增。如果管理不当,这些事件可能会造成损坏,因为它们会对电气元件(尤其是母线)产生极大的力和热效应。 短路时&#x…

cuda实现flash_attn_mma_share_kv源码分析

一 源码分析 1.1 函数入口 void flash_attn_mma_stages_split_q_shared_kv(torch::Tensor Q, torch::Tensor K, torch::Tensor V, torch::Tensor O, int stages) {CHECK_TORCH_TENSOR_DTYPE(Q, torch::kHalf) // Q [B,H,N,D]CHECK_TORCH_TENSOR_DTYPE(K, torch::kHalf) // K …

npm发布流程说明

一、进入要发布的项目根目录,初始化为npm包 npm initname:最重要的字段之一,项目名称(少于214个字节)。没有name和version不能进行安装; version:最重要的字段之一,项目版本。没有n…

Unity自定义编辑器:基于枚举类型动态显示属性

1.参考链接 2.应用 target并设置多选编辑 添加[CanEditMultipleObjects] using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;[CustomEditor(typeof(LightsState))] [CanEditMultipleObjects] public class TestInspector :…

利用 Python 脚本批量创建空白 Markdown 笔记

文章目录 利用 Python 脚本批量创建空白 Markdown 笔记1 背景介绍2 需求描述3 明确思路4 具体实现4.1. 遍历 toc.md 文件,收集文件名和对应的文件内容4.2. 实现文件批量生成逻辑4.3. 补全缺失的工具函数4.4. 进一步补全工具函数中的工具函数 5 脚本运行6 注意事项 利…

Apache XMLBeans 一个强大的 XML 数据处理框架

Apache XMLBeans 是一个用于处理 XML 数据的 Java 框架,它提供了一种方式将 XML Schema (XSD) 映射到 Java 类,从而使得开发者可以通过强类型化的 Java 对象来访问和操作 XML 文档。下面将以一个简单的案例说明如何使用 Apache XMLBeans 来解析、生成和验…

计算机毕业设计Python机器学习农作物健康识别系统 人工智能 图像识别 机器学习 大数据毕业设计 算法

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

2024-2029年中国毛绒玩具行业市场分析及发展前景预测报告

引言:重要性及市场增长趋势 在快节奏的现代生活中,毛绒玩具以其柔软触感和温馨陪伴,成为了许多人心灵的慰藉。它们不仅是儿童的忠实玩伴,更是成人世界里不可或缺的情感寄托。近年来,随着消费者情感需求的日益增长和个…

安装vue脚手架出现的一系列问题

安装vue脚手架出现的一系列问题 前言使用 npm 安装 vue/cli2.权限问题及解决方法一:可以使用管理员权限进行安装。方法二:更改npm全局安装路径 前言 由于已有较长时间未进行 vue 项目开发,今日着手准备开发一个新的 vue 项目时,在…

YARN WebUI 服务

一、WebUI 使用 与HDFS一样,YARN也提供了一个WebUI服务,可以使用YARN Web用户界面监视群集、队列、应用程序、服务、流活动和节点信息。还可以查看集群详细配置的信息,检查各种应用程序和服务的日志。 1.1 首页 浏览器输入http://node2.itc…

误差与误差限

目录 误差误差限小结 误差 设 x x x为准确值 , x ∗ ,x^* ,x∗为 x x x的一个近似值,称 e ∗ x ∗ − x e^*x^*-x e∗x∗−x为近似值的绝对误差,简称误差. 这样定义的误差 e ∗ e^{*} e∗可正可负,当绝对误差为正时近似值偏大,…

JavaSE——网络编程

一、InetAddress类 InetAddress是Java中用于封装IP地址的类。 获取本机的InetAddress对象: InetAddress localHost InetAddress.getLocalHost();根据指定的主机名获取InetAddress对象(比如说域名) InetAddress host InetAddress.getByNa…