java 快速记忆卡1.5版

java 快速记忆卡1.5版

  1. 在FlashCard类中,优化了chooseFile方法,增加了addFileExtensionName方法,使用户在保存文件时能够将选择的文件扩展名自动加到文件末尾。

FlashCard类

package flashcard;

import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.filechooser.FileFilter;


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 title, boolean openOrSave) {     //选择文件的一个方法
		JFileChooser chooser = new JFileChooser();
		chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);   //定义JFileChooser仅能选取文件
		chooser.setDialogTitle(title);
		chooser.setFileFilter(new DocFileFilter());
		chooser.setFileFilter(new TxtFileFilter());		
		if(openOrSave == true) {
			chooser.showOpenDialog(frame);
		}else {
			chooser.showSaveDialog(frame);
		}	
		File file = chooser.getSelectedFile();
		if(openOrSave == false) {      //如果是保存操作,加扩展名
			FileFilter filter = chooser.getFileFilter();    //获取JFileChooser选择的文件筛选器
			file = addFileExtensionName(file, filter);
		}
		return file;
	}	
	
	public File addFileExtensionName(File file, FileFilter filter) {    //将定义的扩展名后缀加到文件末尾
		File newFile = null;
		if(filter.getDescription().equals(".txt(txt文件)")) {
			if((file != null) &&(file.getName().toLowerCase().endsWith(".txt"))) {
				newFile = file;
			}else {
				newFile = new File(file.getAbsolutePath() + ".txt");
			}
		}else if(filter.getDescription().equals(".doc(doc文件)")) {
			if((file != null) && (file.getName().toLowerCase().endsWith(".doc"))) {
				newFile = file;
			}else {
				newFile = new File(file.getAbsolutePath() + ".doc");
			}
		}
		return newFile;
	}
	
	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);
		}
	}
}

QuizCard类

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;
	}
}

TxtFileFilter类(筛选txt文件)

package flashcard;

import javax.swing.filechooser.FileFilter;     //此处注意:需引用filechooser下边的FileFilter
import java.io.File;

public class TxtFileFilter extends FileFilter{
	//override两个方法
	public String getDescription() {            //显示下拉框的文件描述
		return ".txt(txt文件)";
	}
    
	public boolean accept(File f) {            //以txt结尾的文件筛选的代码
		if(f.getName().toLowerCase().endsWith(".txt")) {
			return true;
		}else {
			return false;
		}
	}
}

DocFileFilter类(筛选doc文件)

package flashcard;

import java.io.File;
import javax.swing.filechooser.FileFilter;     //此处注意:需引用filechooser下边的FileFilter

public class DocFileFilter extends FileFilter{
	//override两个方法
	public String getDescription() {               //显示下拉框的文件描述
		return ".doc(doc文件)";
	}
	
	public boolean accept(File f) {
		if(f.getName().toLowerCase().endsWith(".doc")) {     //以doc结尾的文件筛选的代码
			return true;
		}else {
			return false;
		}
	}
}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值