您的位置:首页 > 编程语言 > Java开发

卡片-问题和答案

2017-10-23 22:48 176 查看
第一章  问题描述

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

首先,要做出卡片:

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

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

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

其次,输出卡片:

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

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

菜单界面,加载卡片;

第二章  基础的卡片类

因为做卡片和显示卡片都要用到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());

因为是保存文件,可能要保存到旧的文件里,或者保存到新的文件里,保存到新文件,保存的文件没有后缀???

半致命缺点:

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



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

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

4000

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<Card> 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<Card>();
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();
}
}
}




第四章  显示卡片

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

回车是LF;换行是CR|LF

一个也读不出;



只能读2行



完美读入;



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<Card> 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");
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  head first java 卡片游戏