卡片-问题和答案

第一章  问题描述

小时候玩过一种卡片,正面是问题描述,背面是答案,现在我们把这种卡片做出来。

首先,要做出卡片:

创建一个图形界面,里面有两个文本域,一个用来输入问题,一个用来输入答案;

一个按钮,用来输入下一张卡片;

菜单界面,保存和创建新的卡片;


其次,输出卡片:

创建一个图形界面,里面有一个文本域,用来显示问题和答案;

一个按钮,点击后显示问题/答案;

菜单界面,加载卡片;


第二章  基础的卡片类

因为做卡片和显示卡片都要用到String类型的问题和答案,所以先做一个卡片类;

package card;

/*
 * 卡片数据
 * 
 */
public class Card {
	private String question;
	private String answer;
	public Card(String q,String a) {
		question = q;
		answer = a;
	}
	public String getQuestion() {
		return question;
	}
	public String getAnswer() {
		return answer;
	}
}


第三章  做卡片

注意1:文件内换行在windows下是/r/n,mac是/n;

或者用自带的换行:

BufferedWriter write1 = new BufferedWriter(new FileWriter(file));
write1.newLine();//根据系统自动匹配换行;
注意2:
fileSave.showSaveDialog(frame);
saveFile(fileSave.getSelectedFile());
因为是保存文件,可能要保存到旧的文件里,或者保存到新的文件里,保存到新文件,保存的文件没有后缀???

半致命缺点:

在文本域输入英文可以,但是输入中文,就没有提示;就是

卡片-问题和答案_第1张图片

但是按下空格可以选择中文,求助!!!

这个问题,我用的是百度输入法,没提示;用讯飞,有提示,不知道为啥。

package card;


import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;

/*
 * 输入问题和答案,点击next继续输入;
 * 菜单的save选项会保存问题和答案到txt中
 * 
 */
public class CardBuild {
	
	private JFrame frame ;
	private ArrayList cardList;
	private JTextArea question;
	private JTextArea answer;
	
	public static void main(String[] args) {
		CardBuild build = new CardBuild();
		build.go();
	}
	//create gui
	public void go(){
		frame = new JFrame("build card");
		JPanel panel1 = new JPanel();//creat a 面板
		Font bigFont = new Font("楷体", Font.BOLD, 24);//设定字体
		
		question = new JTextArea(6,20);//6行20列,每行20个英文字母
		question.setFont(bigFont);
		//设定textarea换行功能
		//设定换行策略;为true,当行的长度大于所分配的宽度时,将自动换行。为 false,始终不换行
		question.setLineWrap( true);
		//为 true,则当行的长度大于所分配的宽度时,将在单词边界(空白)处换行。如果设置为 false,则将在字符边界处换行
		question.setWrapStyleWord(true);
		//设定textarea的滚动条
		JScrollPane qScroller = new JScrollPane(question);
		//只有垂直滚动条
		qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		
		//设定答案的文本区域
		answer = new JTextArea(6,20);
		answer.setFont(bigFont);
		answer.setLineWrap(true);
		answer.setWrapStyleWord(true);
		JScrollPane aScroller = new JScrollPane(answer);
		aScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		aScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		
		//设定小组件
		JButton nextButton = new JButton("next card");
		nextButton.setFont(bigFont);
		cardList = new ArrayList();
		JLabel qLabel = new JLabel("question:");
		qLabel.setFont(bigFont);
		JLabel aLabel = new JLabel("answer:");
		aLabel.setFont(bigFont);
		//使用box,垂直排列,按顺序添加
		Box box = new Box(BoxLayout.Y_AXIS);
		box.add(qLabel);
		//这是添加一个不可见的组件,垂直支柱
		box.add(Box.createVerticalStrut(5));
		box.add(qScroller);
		box.add(Box.createVerticalStrut(5));
		box.add(aLabel);
		box.add(Box.createVerticalStrut(5));
		box.add(aScroller);
		box.add(Box.createVerticalStrut(20));
		box.add(nextButton);
		panel1.add(BorderLayout.CENTER, box);
		
		nextButton.addActionListener(new nextCardListener());//注册监听
		//菜单
		JMenuBar menuBuild = new JMenuBar();
		JMenu file = new JMenu("File");
		JMenuItem newMenu = new JMenuItem("New");
		JMenuItem saveMenu = new JMenuItem("Save");
		newMenu.addActionListener(new newMenuListener());
		saveMenu.addActionListener(new saveMenuListener());
		//菜单添加
		file.add(newMenu);
		file.add(saveMenu);
		menuBuild.add(file);
		frame.setJMenuBar(menuBuild);
		
		frame.getContentPane().add(BorderLayout.CENTER,panel1);
		//frame.getContentPane().add(panel1);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(300,100,600,600);
		frame.setVisible(true);
	}
	
	//点击next时会触发,表示user完成输入,并继续下一张卡片
	private class nextCardListener implements ActionListener{
		//向列表中增加当前卡片并清除文本域
		public void actionPerformed(ActionEvent e) {
			Card card = new Card(question.getText(), answer.getText());
			cardList.add(card);
			clearCard();
		}
	}
	
	//点击menu-save会触发,保存到文本中
	private class saveMenuListener implements ActionListener{
		//生成对话框,输入用户名并保存设置 
		public void actionPerformed(ActionEvent e) {
			Card card = new Card(question.getText(), answer.getText());
			cardList.add(card);
			
			JFileChooser fileSave = new JFileChooser();
			//调出存盘对话框(dialog),等待用户决定
			fileSave.showSaveDialog(frame);
			saveFile(fileSave.getSelectedFile());
		}
	}
	
	//点击new被触发
	private class newMenuListener implements ActionListener{
		//打开一组新的卡片,清除卡片列表和文本域
		public void actionPerformed(ActionEvent e) {
			cardList.clear();
			clearCard();
		}
	}
	
	//清除card
	private void clearCard() {
		question.setText("");
		answer.setText("");
		//把输入焦点放在调用这个方法的控件上
		question.requestFocus();
	}
	//将列表保存到txt中
	private void saveFile(File file){
		try {
			BufferedWriter write = new BufferedWriter(new FileWriter(file));
			for(Card card:cardList){
				//一行一张卡片,由/分开问题和答案
				write.write(card.getQuestion() + "/");
				write.write(card.getAnswer() + "\r\n");
			}
			write.close();
		} catch (IOException e) {
			System.out.println("文件保存失败!");
			e.printStackTrace();
		}
	}
}

卡片-问题和答案_第2张图片

第四章  显示卡片

问题:你输入的时候,不能换行,因为读取的时候是读取一行,问题和答案用 / 分割;如果你输入回车,就会读取异常!

回车是LF;换行是CR|LF

一个也读不出;

卡片-问题和答案_第3张图片


只能读2行

卡片-问题和答案_第4张图片


完美读入;


package card;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;


/*嗯,创建卡片和运行卡片是两个主程序
 * file-load,加载一组卡片数据
 * 显示问题,点击show answer 按钮,显示答案
 */
public class CardPlay {
	private JFrame frame;
	private JButton nextButton;
	private JTextArea display;
	private boolean isShowAnswer;
	private Card currentCard;
	private int currentCardIndex;
	private ArrayList cardList;

	public static void main(String[] args) {
		CardPlay play = new CardPlay();
		play.go();
		//如果cardlist为null,他会报道异常
		//System.out.println(play.cardList.size());
	}

	//创建gui
	public void go(){
		frame = new JFrame("play card");
		JPanel panel = new JPanel();
		Font bigFont = new Font("楷体", Font.BOLD, 24);
		cardList = new ArrayList<>();
		//创建一个显示问题/答案的JTextarea文本域
		display = new JTextArea(10,20);
		display.setFont(bigFont);
		//自动换行
		display.setLineWrap( true);
		//设置指定的 boolean 变量,以指示此 TextComponent 是否应该为可编辑的
		display.setEditable(false);
		//设定滚动条
		JScrollPane qScroller = new JScrollPane(display);
		//只有垂直滚动条
		qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		//设定button,添加
		nextButton = new JButton("show question");
		nextButton.addActionListener(new nextCardListener());
		panel.add(qScroller);
		panel.add(nextButton);

		//设定菜单
		JMenuBar menuBar = new JMenuBar();
		JMenu file = new JMenu("File");
		//加载卡片
		JMenuItem load = new JMenuItem("load card");
		load.addActionListener(new loadCardListener());

		//添加到frame
		file.add(load);
		menuBar.add(file);
		frame.setJMenuBar(menuBar);

		frame.getContentPane().add(BorderLayout.CENTER, panel);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(300,100,600,600);
		frame.setVisible(true);
	}

	//监听next按钮
	public class nextCardListener implements ActionListener{

		public void actionPerformed(ActionEvent e) {
			//为true,显示答案;为false,显示问题
			if(isShowAnswer){
				//显示获取的答案
				display.setText(currentCard.getAnswer());
				//设定按钮上的文字
				nextButton.setText("next card");
				isShowAnswer = false;

			}else {
				if(currentCardIndex < cardList.size()){ //说明还有卡片
					currentCard = cardList.get(currentCardIndex);
					currentCardIndex++;
					display.setText(currentCard.getQuestion());
					nextButton.setText("show answer");
					isShowAnswer = true;
				}else {
					display.setText("that is last card!");
					isShowAnswer = false;
				}
			}//一级else结束
		}//方法结束
	}//监听button类结束

	//监听菜单loadcard的实现
	public class loadCardListener implements ActionListener{

		public void actionPerformed(ActionEvent e) {
			JFileChooser file = new JFileChooser( );
			//打开一个对话框,选择文件
			file.showOpenDialog(frame);
			//调用方法  loadfile,参数是你在对话框选中的文件
			loadFile(file.getSelectedFile());
		}
	}

	public void loadFile(File file){
		//建立缓冲区
		try {
			BufferedReader read = new BufferedReader(new FileReader(file));
			//此时,file文件的内容都到了缓存里面
			String line;
			//readLine(),每次从read中读取一行
			while((line=read.readLine()) != null){
				//这一行数据,问题和答案在一起,分割
				makeCard(line);
			}
			read.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	
	public void makeCard(String line){
		String[] result = line.split("/");
		Card card1 = new Card(result[0], result[1]);
		//cardlist中的每个元素都是文件中的一行!!!!!!!!
		cardList.add(card1);
		System.out.println("make a card");
	}
}

卡片-问题和答案_第5张图片










你可能感兴趣的:(java)