java 快速记忆卡1.3版
1.增加了随机展示卡片功能。
package flashcard;
import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.filechooser.*;
public class FlashCard {
private JFrame frame;
private JPanel mainPanel;
private JMenuBar menuBar;
private JMenu fileMenu;
private JMenuItem newMenuItem;
private JMenuItem openMenuItem;
private JMenuItem loadOrderlyMenuItem;
private JMenuItem loadRandomlyMenuItem;
private JMenuItem saveMenuItem;
private JMenuItem exitMenuItem;
private JTextArea question;
private JTextArea answer;
private JTextArea display;
private ArrayList<QuizCard> cardBuildList; // 新建或读取原有卡片时,临时储存卡片数据,保存时数据输入文件
private ArrayList<QuizCard> cardPlayList; // 载入卡片时,储存卡片数据
private JButton nextButtonBuild;
private JButton saveButtonBuild;
private JButton nextButtonPlay;
private boolean isShowAnswer;
private int currentCardIndex;
private QuizCard currentCard;
private File fileBuild;//保存原有卡片的路径
boolean cardExist;//标志原有卡片是否存在,true为存在,false为不存在
public static void main(String[] args) {
FlashCard fc = new FlashCard();
fc.setFrameGui();
}
public void setFrameGui() {
frame = new JFrame("快速记忆卡");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainPanel = new JPanel();
menuBar = new JMenuBar();
fileMenu = new JMenu("文件");
newMenuItem = new JMenuItem("新建卡片");
openMenuItem = new JMenuItem("打开卡片");
loadOrderlyMenuItem = new JMenuItem("顺序复习卡片");
loadRandomlyMenuItem = new JMenuItem("随机复习卡片");
saveMenuItem = new JMenuItem("保存卡片");
exitMenuItem = new JMenuItem("退出");
saveMenuItem.setEnabled(false); // 在初始界面,saveMenuItem不能操作
// 给五个菜单项添加监听器
newMenuItem.addActionListener(new NewMenuListener());
openMenuItem.addActionListener(new OpenMenuListener());
loadOrderlyMenuItem.addActionListener(new LoadOrderlyMenuListener());
loadRandomlyMenuItem.addActionListener(new LoadRandomlyMenuListener());
saveMenuItem.addActionListener(new SaveMenuListener());
exitMenuItem.addActionListener(new ExitListener());
fileMenu.add(newMenuItem);
fileMenu.add(openMenuItem);
fileMenu.add(saveMenuItem);
fileMenu.add(loadOrderlyMenuItem);
fileMenu.add(loadRandomlyMenuItem);
fileMenu.add(exitMenuItem);
menuBar.add(fileMenu);
frame.setJMenuBar(menuBar);
frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
frame.setSize(500, 600);
frame.setResizable(false); // frame窗口不能调整大小
frame.setVisible(true);
}
// 关于card build相关的方法
public class NewMenuListener implements ActionListener {
public void actionPerformed(ActionEvent ev) {
setNewGui();
cardBuildList = new ArrayList<QuizCard>();
cardExist = false;
}
}
public class OpenMenuListener implements ActionListener {
public void actionPerformed(ActionEvent ev) {
fileBuild = chooseFile("打开卡片", true);
if (fileBuild != null) {
cardBuildList = new ArrayList<QuizCard>();
loadFile(fileBuild, cardBuildList);
setNewGui();
setQuestionText();
saveMenuItem.setEnabled(true);
cardExist = true;
}
}
}
private void setNewGui() { // newMenuItem和openMenuItem的界面
mainPanel.removeAll(); // mainPanel清除所有组件
saveMenuItem.setEnabled(true); // saveMenuItem这时可以操作
Font bigFont = new Font("sanserif", Font.BOLD, 20);
question = new JTextArea(6, 25);
question.setLineWrap(true); // 可以换行
question.setWrapStyleWord(true); // 设置文本区域换行样式
question.setFont(bigFont); // 设置question的字体
// question(JTextArea对象)添加滚动条,竖直可以滚动,横向不可以滚动
JScrollPane qScroller = new JScrollPane(question);
qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
answer = new JTextArea(6, 25);
answer.setLineWrap(true);
answer.setWrapStyleWord(true);
answer.setFont(bigFont);
JScrollPane aScroller = new JScrollPane(answer);
aScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
aScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
nextButtonBuild = new JButton("输入下一张");
saveButtonBuild = new JButton("保存");
// 给两个按钮添加监听器
nextButtonBuild.addActionListener(new NextCardBuildListener());
saveButtonBuild.addActionListener(new SaveMenuListener());
JLabel qLabel = new JLabel("问题:");
JLabel aLabel = new JLabel("答案:");
// mainPanel添加相关组件,组件按照添加顺序以FlowLayout进行布置
mainPanel.add(qLabel);
mainPanel.add(qScroller);
mainPanel.add(aLabel);
mainPanel.add(aScroller);
mainPanel.add(nextButtonBuild);
mainPanel.add(saveButtonBuild);
frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
frame.setSize(500, 600);
frame.setResizable(false); // frame窗口不能调整大小
frame.setVisible(true);
}
private void setQuestionText() {
question.setText("请继续原卡片录入新的问题...");
question.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent ev) {
question.setText("");
}
});
}
public class NextCardBuildListener implements ActionListener { // nextButtonBuild的监听器
public void actionPerformed(ActionEvent ev) {
if (question.getText().equals("") || answer.getText().equals("")) { // 若question和answer(JTextArea对象)有一项没有输入文字,则显示对话框进行提示
JOptionPane.showMessageDialog(null, "问题和答案不能为空!", "information message", JOptionPane.INFORMATION_MESSAGE);
} else { // 若question和answer(JTextArea对象)都输入文字,则新建卡片并将卡片加入cardBuildList,随后清空question和answer的内容
QuizCard card = new QuizCard(question.getText(), answer.getText());
cardBuildList.add(card);
clearCard();
}
}
}
private void clearCard() { // 将卡片加入cardBuildList后,清空question和answer两个TextArea
question.setText("");
answer.setText("");
question.requestFocus(); // 将录入光标获取到question的文本框内
}
public class SaveMenuListener implements ActionListener { // saveButtonBuild和saveMenuItem的监听器
public void actionPerformed(ActionEvent ev) {
if (question.getText().equals("") || answer.getText().equals("")) { // 点击保存菜单和保存按钮时,若question和answer有一项为空,则此张卡片不保存
} else { // 点击保存菜单和保存按钮时,若question和answer两者都有内容,则此张卡片保存
QuizCard card = new QuizCard(question.getText(), answer.getText());
cardBuildList.add(card);
}
if (cardExist == false) { //若文件为新建文件,则打开保存对话框进行保存
File saveFile = chooseFile("保存卡片", false);
if(saveFile != null) {
saveFile(saveFile);
saveButtonBuild.setEnabled(false);
saveMenuItem.setEnabled(false);
nextButtonBuild.setEnabled(false);
}
} else if (cardExist == true) { //若文件为已打开文件,则直接保存,并显示已保存
saveFile(fileBuild);
saveButtonBuild.setEnabled(false);
saveMenuItem.setEnabled(false);
nextButtonBuild.setEnabled(false);
JOptionPane.showMessageDialog(null, "文件已保存!", "information message", JOptionPane.INFORMATION_MESSAGE);
}
}
}
private void saveFile(File file) {
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(file)); // 建立BufferedWriter对象,将内容写入文件
for (QuizCard card : cardBuildList) { // 遍历cardBuildList将所有卡片内容输出到文件
writer.write(card.getQuestion() + "/");
writer.write(card.getAnswer() + "\n");
}
writer.close(); // BufferedWriter对象关闭
} catch (IOException ex) {
System.out.println("couldn't write the cardList out");
ex.printStackTrace();
}
}
// 关于card play相关的方法
public class LoadOrderlyMenuListener implements ActionListener { // loadOrderlyMenuItem菜单项的监听器
public void actionPerformed(ActionEvent ev) {
File loadFile = chooseFile("打开卡片", true);
if(loadFile != null) { //若打开了相关文件,则进行下边的初始化工作
cardPlayList = new ArrayList<QuizCard>();
loadFile(loadFile, cardPlayList);
setLoadGui();
currentCardIndex = 0;
isShowAnswer = false;
}
}
}
public class LoadRandomlyMenuListener implements ActionListener{
public void actionPerformed(ActionEvent ev) {
File loadFile = chooseFile("打开卡片", true);
if(loadFile != null) { //若打开了相关文件,则进行下边的初始化工作
cardPlayList = new ArrayList<QuizCard>();
loadFile(loadFile, cardPlayList);
cardPlayList = arrangeCardRandomly(cardPlayList);
setLoadGui();
currentCardIndex = 0;
isShowAnswer = false;
}
}
}
public File chooseFile(String st, boolean openOrSave) { //选择文件的一个方法
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("txt", "doc"); //此处需优化
chooser.addChoosableFileFilter(filter);
chooser.setDialogTitle(st);
if(openOrSave == true) {
chooser.showOpenDialog(frame);
}else {
chooser.showSaveDialog(frame);
}
return chooser.getSelectedFile();
}
public void setLoadGui() { //loadOrderlyMenuItem和loadRandomlyMenuItem的初始化界面
mainPanel.removeAll(); // mainPanel移除所有组件
saveMenuItem.setEnabled(false); // saveMenuItem菜单项不能操作
Font bigFont = new Font("sanserif", Font.BOLD, 20);
// 初始化展示框
display = new JTextArea(6, 25);
display.setFont(bigFont);
display.setLineWrap(true);
display.setEditable(false); // 设定display(JTextArea对象)无法编辑
JScrollPane qScroller = new JScrollPane(display);
qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
nextButtonPlay = new JButton("显示问题");
mainPanel.add(qScroller);
nextButtonPlay.addActionListener(new NextCardPlayListener());
mainPanel.add(nextButtonPlay);
frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
frame.setSize(500, 600);
frame.setResizable(false);
frame.setVisible(true);
}
public class NextCardPlayListener implements ActionListener { // nextButtonPlay的监听器
public void actionPerformed(ActionEvent ev) {
if (cardPlayList == null) { // 若cardPlayList为空,则弹出对话框,显示请载入卡片
JOptionPane.showMessageDialog(null, "请载入卡片!", "information message", JOptionPane.INFORMATION_MESSAGE);
} else { // 若cardPlayList不为空,则展示卡片
if (isShowAnswer) { // 若isShowAnswer为true,则显示答案,nextButtonPlay按钮文字显示为下一张卡片
display.setText(currentCard.getAnswer());
nextButtonPlay.setText("下一张卡片");
isShowAnswer = false;
} else {
if (currentCardIndex < cardPlayList.size()) { // 若isShowAnswer为false,且currentCardIndex小于cardPlayList中对象的数量,展示下一张卡片
showNextCard();
} else { // 若isShowAnswer为false,且currentCardIndex大于等于cardPlayList中对象的数量,display显示文本这是最后一张卡片
display.setText("这是最后一张卡片");
nextButtonPlay.setEnabled(false); // nextButtonPlay按钮设置为不能操作
}
}
}
}
}
private void loadFile(File file, ArrayList<QuizCard> cardList) { //载入文件并制作卡片,存入cardList
try {
BufferedReader reader = new BufferedReader(new FileReader(file)); // 建立BufferedReader对象,从文件中读取数据
String line = null;
while ((line = reader.readLine()) != null) { // 每次从文件中读取一行,若读取内容不为null,一直读
makeCard(line, cardList); // 读一行,做一张卡
}
reader.close(); // 读取完毕,reader关闭
} catch (Exception ex) {
System.out.println("could't read the card file");
ex.printStackTrace();
}
}
private void makeCard(String lineToParse, ArrayList<QuizCard> cardList) { //将读入的每一行数据制作成卡片,存入cardList
String[] result = lineToParse.split("/"); // 将每一行带/的数据,在/处分隔为两个String对象,存入result数组
QuizCard card = new QuizCard(result[0], result[1]); // 利用QuizCard的构造函数,新建卡片
cardList.add(card); // 将新卡片加入cardList
}
private ArrayList<QuizCard> arrangeCardRandomly(ArrayList<QuizCard> orderList){ //将顺序的卡片做成随机的卡片
ArrayList<QuizCard> randomList = new ArrayList<QuizCard>();
int i ;
QuizCard tempCard;
while(orderList.isEmpty() != true) {
i = (int)(Math.random() * orderList.size());
tempCard = orderList.get(i);
randomList.add(tempCard);
orderList.remove(i);
}
return randomList;
}
private void showNextCard() {
currentCard = cardPlayList.get(currentCardIndex);
currentCardIndex++;
display.setText(currentCard.getQuestion());
nextButtonPlay.setText("显示答案");
isShowAnswer = true;
}
// file菜单下exitMenuItem的监听器
public class ExitListener implements ActionListener {
public void actionPerformed(ActionEvent ev) {
System.exit(0);
}
}
}
package flashcard;
public class QuizCard {
private String question;
private String answer;
QuizCard(String q, String a) {
question = q;
answer = a;
}
public String getQuestion() {
return question;
}
public String getAnswer() {
return answer;
}
}