项目演练 - 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 》 |
---|