当前位置: 首页 > news >正文

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

项目演练 - Quizzes #3

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

本篇文章继续实现卡片引擎的代码,与编辑器一样也是由 GUI 展现给用户。 允许从磁盘上读取数据文件然后生成答题卡,用户点击「下一个」按钮就可以显示下个题目内容。

一、QuizCardEngine 类结构

我们从类结构开始,然后在按顺序逐个方法实现,最后编译运行。

/*** 文件:QuizCardEngine.java* 描述:加载数据文件,然后生成卡片并展示。*/
public class QuizCardEngine {public void init() {// TODO:}private void load(File file) {// TODO:}private void make(String token) {// TODO:}private void showNext() {// TODO:}class OpenCardListener implements ActionListener {public void actionPerformed(ActionEvent e) {// TODO:}}class NextCardListener implements ActionListener {public void actionPerformed(ActionEvent e) {// TODO:}}public static void main(String[] args) {// TODO:}
}

二、功能模块代码

1. 变量声明

private JFrame frame;				// 主窗口框架,所有组件的基板
private JTextArea display;			// 用来显示题目或答案等信息的文本域组件
private JButton nextButton;			// 用来显示下一组内容的按钮组件
private QuizCard currentCard;		// 用来保存当前显示在界面中的卡片
private ArrayList<QuizCard> cards;	// 载入的所有卡片都放在这里private int currentCardIndex;		// 用来记录当前显示的卡片索引值
private boolean isShowAnswer;		// 用来标识当前显示的是题目还是答案

2. QuizCardEngine()

这是类的构造方法,通常做法是把一些变量的初始化工作放在这里执行。 比如这里初始化了一个空的卡片数据列表:

// 构造方法,初始化卡片数据列表
public QuizCardEngine() {cards = new ArrayList<QuizCard>();
}

3. main()

应该很熟悉这个方法了,程序从这里开始执行。

// 程序执行入口,新建卡片引擎准备初始化
public static void main(String[] args) {new QuizCardEngine().init();
}

4. init()

这个方法用于创建 GUI 组件,同时注册了两个按钮事件。 代码如下:

// 创建 GUI 以及一些必要设置
public void init() {// 设置文本域显示的字体Font font = new Font("微软雅黑", Font.BOLD, 24);// 创建并设置文本域display = new JTextArea(5, 20);display.setFont(font);			// 设置文本域字体样式display.setWrapStyleWord(true);	// 是否保持完整单词折行display.setLineWrap(true);		// 是否自动换行display.setEditable(false);		// 是否禁用文本编辑// 创建滚动面板,可以显示更多文本内容JScrollPane queScroller = new JScrollPane(display);queScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);queScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);// 创建「下一个」按钮nextButton = new JButton("显示题目");nextButton.addActionListener(new NextCardListener());// 创建「载入」按钮JButton openButton = new JButton("载入卡片");openButton.addActionListener(new OpenCardListener());// 创建组件容器面板,并把上面创建的组件加入进来JPanel panel = new JPanel();panel.add(queScroller);panel.add(openButton);panel.add(nextButton);// 创建窗口框架frame = new JFrame("答题卡 v1.0");frame.getContentPane().add(BorderLayout.CENTER, panel);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setLocationRelativeTo(null);frame.setSize(530, 275);frame.setVisible(true);
}

5. OpenCardListener

这是一个内部类,用来监听「载入」按钮的点击事件。 用户点击该按钮后会弹出文件选择对话框,选择文件后开始加载数据。 代码如下:

// 按钮监听类
class OpenCardListener implements ActionListener {public void actionPerformed(ActionEvent e) {// 打开文件对话框JFileChooser fileOpen = new JFileChooser();fileOpen.showOpenDialog(frame);// 载入数据文件load(fileOpen.getSelectedFile());}
}

6. NextCardListener

这是一个内部类,用来监听「下一个」按钮的点击事件。 如果用户点击该按钮时则会显示当前题目或者答案。 代码如下:

// 内部监听类
class NextCardListener implements ActionListener {public void actionPerformed(ActionEvent e) {// 如果应该显示答案if (isShowAnswer) {display.setText(currentCard.getAnswer());nextButton.setText("下组卡片");isShowAnswer = false;return;}// 如果应该显示题目if (currentCardIndex < cards.size()) {showNext();}// 已经是最后一张卡片了else {display.setText("没有更多卡片");nextButton.setEnabled(false);	// 按钮置灰不可用}}
}

7. load()

这个方法可以读取指定的文件数据,然后根据读取到的数据生成实际的卡片,并显示在文本域中供用户浏览。 代码如下:

// 加载指定的数据文件
private void load(File file) {try {// 使用缓存技术提高读取效率FileReader fr = new FileReader(file);BufferedReader reader = new BufferedReader(fr);String line = null;// 读取数据,没读取一行就生成一个卡片while((line = reader.readLine()) != null) {make(line);}// 关闭读取流reader.close();} catch (Exception e) {// 异常处理System.out.println("couldn't read the cards file.");e.printStackTrace();}
}

8. make()

这个方法用来创建卡片数据,根据提供的字符串进行解析,提取题目和答案数据,然后保存在卡片列表中。 请看代码:

// 根据指定的字符串数据创建卡片
private void make(String token) {String[] result = token.split("/");	// 解析卡片数据QuizCard card = new QuizCard(result[0], result[1]);	// 新建卡片cards.add(card);	//添加到卡片列表中
}

9. showNext()

这个方法用来显示下一组内容。 根据 isShowAnswer 判断应该显示题目或者是答案内容。 请看代码:

// 显示下一组内容
private void showNext() {currentCard = cards.get(currentCardIndex);currentCardIndex++;display.setText(currentCard.getQuestion());nextButton.setText("显示答案");isShowAnswer = true;
}

三、编译、执行

这是启动后的界面:
启动

这是载入时的界面:
载入

这是显示题目时的界面:
显示卡片题目
OK,到此为止,Quizzes 暂时就这样了,如果大家还有更好的创意可以自由发挥,修改到功能更加完善。

四、心里话

老白把注意力暂时从 GUI 转移到网络,准备进军这个领域。 说实话,老白有些打怵。 因为以前从来没有接触过这方面的知识,可以说是白上加白。 网络给人的印象本就是神秘、高端局,是否能弄明白确实心里没底。 但总归还是要碰一碰的,硬上吧。


《 上一篇 项目演练 - Quizzes #2下一篇 重返文字聊天的年代(一) 》

http://www.mrgr.cn/news/83453.html

相关文章:

  • c#版本、.net版本、visual studio版本之间的对应关系
  • GaussDB分布式数据倾斜处理
  • 记一次sealos部署k8s集群之delete了第一台master如何恢复
  • Linux的各种初始化注册方法
  • rom定制系列------小米max3安卓12 miui14批量线刷 默认开启usb功能选项 插电自启等
  • 18_C语言 -位运算
  • nvim 打造成可用的IDE(2)
  • 性能测试04|JMeter:连接数据库、逻辑控制器、定时器
  • 二分答案(进阶)
  • HarmonyOS:@LocalBuilder装饰器: 维持组件父子关系
  • 算法题(32):三数之和
  • C语言数据结构与算法(排序)详细版
  • 如何让QPS提升20倍
  • AI人工智能(2):机器学习
  • SCI科研论文配色方案:色彩丰富的情况下就是白背景;浅色系
  • OCR文字识别—基于PP-OCR模型实现ONNX C++推理部署
  • 赛灵思(Xilinx)公司Artix-7系列FPGA
  • 【Linux】正则表达式
  • Vue2+OpenLayers调用WMTS服务初始化天地图示例
  • git lfs
  • Docker 基础知识
  • Flyte工作流平台调研(四)——服务部署
  • 【数据分析】一、初探 Numpy
  • 计算机视觉算法实战——视频分析(Video Analysis)
  • 【Vim Masterclass 笔记09】S06L22:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第一部分)
  • SpringCloud项目搭建快速入门