- 实现界面
2.项目结构
3. 数据库
4. 实现代码
1)接口
package memorywords.dao;
public interface MemoryWords {
/*
* 顺便复习下接口相关的知识:
* 1. 接口中的方法全部是public抽象方法(就算不写abstract,public,它也是public抽象方法)
* 2. 接口中的变量只可以用static final 来修饰
* 3. 接口不可以有构造方法,因为接口不可以被实例化,也就是不可以创建对象
* 4. 接口可以继承其他接口
* 5. 一个类可以实现多个接口
*/
//1. 录入单词
void AddWords(String ch,String jp);
//2. 修改单词
void ReviseWords(String id,String jp);
//3. 删除单词
void DeleteWords(String ch );
//4. 记忆单词,随机出现中文单词,要写出对应的日语,
void RemenberWords();
//5. 查询所有
String FindAll();
}
2)实现方法
package memorywords.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
import memorywords.util.JDBC_util;
import memorywords.dao.MemoryWords;
public class MemoryWordsImplement implements MemoryWords {
//实现添加方法
@Override
public void AddWords(String ch, String jp) {
Connection conn = null;
PreparedStatement ps = null;
try {
String sql="insert into JapaneseDate values(null,?,?,0,0,0)";
conn = JDBC_util.getConn();
ps = conn.prepareStatement(sql);
ps.setString(1, ch);
ps.setString(2, jp);
int rs = ps.executeUpdate();
if(rs>0){
System.out.println("添加成功!");
}else{
System.out.println("添加失败!");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBC_util.release(ps, conn);
}
}
// 实现修改方法
@Override
public void ReviseWords(String id, String jp) {
Connection conn = null;
PreparedStatement ps = null;
try {
String sql="update JapaneseDate set Japanese=? where id=?";
conn = JDBC_util.getConn();
ps = conn.prepareStatement(sql);
ps.setString(1, jp);
ps.setString(2, id);
int rs = ps.executeUpdate();
if(rs>0){
System.out.println("修改成功!");
}else{
System.out.println("修改失败!");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBC_util.release(ps, conn);
}
}
// 实现删除方法
@Override
public void DeleteWords(String ch) {
Connection conn = null;
PreparedStatement ps = null;
try {
String sql="delete from JapaneseDate where Chinese=?";
conn = JDBC_util.getConn();
ps = conn.prepareStatement(sql);
ps.setString(1, ch);
int rs = ps.executeUpdate();
if(rs>0){
System.out.println("删除成功!");
}else{
System.out.println("删除失败!");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBC_util.release(ps, conn);
}
}
private Boolean toContinue(Scanner sc){
System.out.println("请选择:1.退出请输入‘1’;2.继续请按任意键");
String opt = sc.nextLine().trim();
Boolean flag = true;
if(opt.equals("1")){
flag = false;
return flag;
}else{
return flag;
}
}
// 实现背单词方法
@Override
public void RemenberWords () {
Connection conn = null;
PreparedStatement ps = null;
Statement st = null;
ResultSet rs = null;
ResultSet rs0 = null;
Scanner sc = new Scanner(System.in);
ArrayList<String> idArray = new ArrayList<String>();
Random rdid = new Random();
Boolean flag = null;
try {
conn = JDBC_util.getConn();
String sql0 = "select id from JapaneseDate";
st = conn.createStatement();
rs0 = st.executeQuery(sql0);
while(rs0.next()){
String no = rs0.getString("id");
idArray.add(no);
}
while(true){
int idx = rdid.nextInt(idArray.size());
String id = idArray.get(idx);
String sql = "select * from JapaneseDate where id=?";
ps = conn.prepareStatement(sql);
ps.setString(1, id);
rs = ps.executeQuery();
if(rs.next()){
String chn = rs.getString("Chinese");
String jap = rs.getString("Japanese").trim();
System.out.println(chn);
System.out.println("请输入对应的日文:");
String answer = sc.nextLine().trim();
if(answer.equals(jap)){
System.out.println("回答正确!");
System.out.println("答案是:");
System.out.println(chn+"\t\t"+jap);
flag = toContinue(sc);
if(flag==false){
break;
}
}else{
System.out.println("回答错误!");
System.out.println("正确答案应该是:");
System.out.println(chn+"\t\t"+jap);
flag = toContinue(sc);
if(flag==false){
break;
}
}
}else{
System.out.println("代码有误。。。");
}
}
System.out.println("欢迎再来。。。");
sc.close();
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBC_util.release(st,rs,rs0, ps, conn);
}
}
// 实现查询所有方法
@Override
public String FindAll() {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
String allinfo = "";
try {
conn = JDBC_util.getConn();
st = conn.createStatement();
String sql = "select * from JapaneseDate";
rs = st.executeQuery(sql);
while(rs.next()){
String no1 = rs.getString("id");
String chn1 = rs.getString("Chinese");
String jap1 = rs.getString("Japanese");
String apeartime1 = rs.getString("AppearTimes");
String righttime1 = rs.getString("RightTimes");
String wrongtime1 = rs.getString("WrongTimes");
String no = String.format("%-5s", no1);
String chn = String.format("%-10s", chn1);
String jap = String.format("%-10s", jap1);
String apeartime = String.format("%-5s", apeartime1);
String righttime = String.format("%-5s", righttime1);
String wrongtime = String.format("%-5s", wrongtime1);
String eachline = no+"\t"+chn+"\t"+jap+"\t"+apeartime+"\t"+righttime+"\t"+wrongtime+"\n";
allinfo += eachline;
System.out.println(no+"\t\t"+chn+"\t\t"+jap);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBC_util.release(rs,st,conn);
}
return allinfo;
}
//处理错误和正确两栏;
public void RightOrWrong(ArrayList<String> contentArray, Boolean flag){
Connection conn = null;
PreparedStatement ps = null;
PreparedStatement ps1 = null;
PreparedStatement ps2 = null;
ResultSet rs = null;
int rttime=0 ;
int wrtime=0 ;
try {
conn = JDBC_util.getConn();
String sql = "select * from JapaneseDate where Chinese=?";
ps = conn.prepareStatement(sql);
String chn = contentArray.get(0);
ps.setString(1, chn);
rs = ps.executeQuery();
if(rs.next()){
rttime = rs.getInt("RightTimes");
wrtime = rs.getInt("WrongTimes");
}else{
System.out.println("代码有误。。。");
}
//System.out.println(rttime);
if(flag==true){
rttime += 1;
String sqlrt = "Update JapaneseDate set RightTimes=? where Chinese=?";
ps1 = conn.prepareStatement(sqlrt);
ps1.setInt(1, rttime);
ps1.setString(2, chn);
ps1.executeUpdate();
System.out.println(rttime);
}else{
wrtime +=1;
String sqlwr = "Update JapaneseDate set WrongTimes=? where Chinese=?";
ps2 = conn.prepareStatement(sqlwr);
ps2.setInt(1, wrtime);
ps2.setString(2, chn);
ps2.executeUpdate();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBC_util.release(rs,ps, ps1,ps2, conn);
}
}
// 与GUI文件关联(关联“下一条”按钮)
public ArrayList<String> Nextbtn(ArrayList<String> idArray){
Connection conn = null;
PreparedStatement ps = null;
PreparedStatement ps1 = null;
ResultSet rs = null;
ArrayList<String> contentArray = new ArrayList<String>();
Random rdid = new Random();
int aprt=0;
//String new_aprt = null;
try {
conn = JDBC_util.getConn();
int idx = rdid.nextInt(idArray.size());
String id = idArray.get(idx);
String sql = "select * from JapaneseDate where id=?";
ps = conn.prepareStatement(sql);
ps.setString(1, id);
rs = ps.executeQuery();
if(rs.next()){
String chn = rs.getString("Chinese");
String jap = rs.getString("Japanese").trim();
String aprtime = rs. getString("AppearTimes").trim();
aprt = Integer.parseInt(aprtime);
aprt +=1;
contentArray.add(chn);
contentArray.add(jap);
}else{
System.out.println("代码有误。。。");
}
String sqlresetnum = "update JapaneseDate set AppearTimes = ? where id = ?";
ps1 = conn.prepareStatement(sqlresetnum);
ps1.setInt(1,aprt);
ps1.setString(2,id);
ps1.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBC_util.release(rs,ps, ps1, conn);
}
return contentArray;
}
//与GUI文件关联(关联“开始练习”按钮)
public ArrayList<String> StartBtn(){
Connection conn = null;
//PreparedStatement ps = null;
Statement st = null;
//ResultSet rs = null;
ResultSet rs0 = null;
ArrayList<String> idArray = new ArrayList<String>();
//Boolean flag = null;
conn = JDBC_util.getConn();
String sql0 = "select id from JapaneseDate";
try {
st = conn.createStatement();
rs0 = st.executeQuery(sql0);
while(rs0.next()){
String no = rs0.getString("id");
idArray.add(no);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBC_util.release(rs0,st, conn);
}
return idArray;
}
/* public String RememeberWordsGui() {
Connection conn = null;
PreparedStatement ps = null;
Statement st = null;
ResultSet rs = null;
ResultSet rs0 = null;
Scanner sc = new Scanner(System.in);
ArrayList<String> idArray = new ArrayList<String>();
Random rdid = new Random();
Boolean flag = null;
try {
conn = JDBC_util.getConn();
String sql0 = "select id from JapaneseDate";
st = conn.createStatement();
rs0 = st.executeQuery(sql0);
while(rs0.next()){
String no = rs0.getString("id");
idArray.add(no);
}
int idx = rdid.nextInt(idArray.size());
String id = idArray.get(idx);
String sql = "select * from JapaneseDate where id=?";
ps = conn.prepareStatement(sql);
ps.setString(1, id);
rs = ps.executeQuery();
if(rs.next()){
String chn = rs.getString("Chinese");
String jap = rs.getString("Japanese").trim();
System.out.println(chn);
System.out.println("请输入对应的日文:");
String answer = sc.nextLine().trim();
if(answer.equals(jap)){
System.out.println("回答正确!");
System.out.println("答案是:");
System.out.println(chn+"\t\t"+jap);
}else{
System.out.println("回答错误!");
System.out.println("正确答案应该是:");
System.out.println(chn+"\t\t"+jap);
}
}else{
System.out.println("代码有误。。。");
}
System.out.println("欢迎再来。。。");
sc.close();
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBC_util.release(st,rs,rs0, ps, conn);
}
return null;
}*/
}
3)测试方法
package memorywords.dao.impl.test;
import java.util.ArrayList;
import org.junit.Test;
import memorywords.dao.MemoryWords;
import memorywords.dao.impl.MemoryWordsImplement;
public class MemoryWordsTest {
//写入相关的测试方法
@Test
public void AddWordsTest(){
MemoryWords mw = new MemoryWordsImplement();//测试重写的方法:将实现类对象指向接口
mw.AddWords("10分","じゅっぷん");
}
@Test
public void FindAllTest(){
MemoryWords mw = new MemoryWordsImplement();
mw.FindAll();
}
@Test
public void ReviseWordsTest(){
MemoryWords mw = new MemoryWordsImplement();
mw.ReviseWords("19","じゅうくにち");
}
@Test
public void RememberTest(){
MemoryWords mw = new MemoryWordsImplement();
mw.RemenberWords();
}
@Test
public void StartBtnTest(){
MemoryWordsImplement mw = new MemoryWordsImplement();//测试实现类中的普通方法
ArrayList<String> idArray = mw.StartBtn();
System.out.println(idArray.get(1));
}
@Test
public void NextbtnTest(){
MemoryWordsImplement mw = new MemoryWordsImplement();
ArrayList<String> idArray = mw.StartBtn();
ArrayList<String> contentArray = mw.Nextbtn(idArray);
System.out.println(contentArray.get(1));
}
}
4)工具类
package memorywords.util;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBC_util {
static String driverClass = null;
static String url = null;
static String username = null;
static String password = null;
// static 中的代码是导入时自动加载的
static{
try {
Properties pt = new Properties();
InputStream is = new FileInputStream("jdbc.properties");
//InputStream is = Close.class.getClassLoader().getResourceAsStream("jdbc.properties");
pt.load(is);
driverClass = pt.getProperty("driverClass");
url = pt.getProperty("url");
username = pt.getProperty("username");
password = pt.getProperty("password");
} catch (Exception e) {
e.printStackTrace();
}
}
// 建立连接
public static Connection getConn(){
Connection conn = null;
try {
//Class.forName(driverClass);
conn = DriverManager.getConnection(url,username,password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//释放资源JDBC_util.release(rs,ps, ps1, conn);
public static void release(ResultSet rs,Statement ps,Statement ps1,Connection conn){
closeRs(rs);
closeSt(ps);
closeSt(ps1);
closeConn(conn);
}
//JDBC_util.release(rs,ps, ps1,ps2, conn);
public static void release(ResultSet rs,Statement ps,Statement ps1,Statement ps2,Connection conn){
closeRs(rs);
closeSt(ps);
closeSt(ps1);
closeSt(ps2);
closeConn(conn);
}
public static void release(ResultSet rs,Statement st,Connection conn){
closeRs(rs);
closeSt(st);
closeConn(conn);
}
public static void release(Statement st,Connection conn){
closeSt(st);
closeConn(conn);
}
public static void release(Connection conn){
closeConn(conn);
}
public static void release(Statement st,ResultSet rs,ResultSet rs0,Statement ps,Connection conn){
closeSt(st);
closeRs(rs);
closeRs(rs0);
closeSt(ps);
closeConn(conn);
}
private static void closeRs(ResultSet rs){
try {
if(rs != null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
rs =null;
}
}
private static void closeSt(Statement st){
try {
if(st != null){
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
st = null;
}
}
private static void closeConn(Connection conn){
try {
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn = null;
}
}
}
5)Gui程序(界面运行)
package memorywords.gui;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import memorywords.dao.MemoryWords;
import memorywords.dao.impl.MemoryWordsImplement;
public class MemoryWordsGui {
private Frame f;// 声明窗口
private Button btn_start,btn_next,btn_end,btn_showall,btn_check;//声明所有按钮
private TextField tf_chn,tf_jap;//声明所有文本框
private TextArea ta;//声明多行文本框
private Label l,l0;//声明标签
private String allinfo; //声明数据库内容字符串
private ArrayList<String> idArray,contentArray;//声明所有的数组
public MemoryWordsGui(){
init();
}
private void init() {
f = new Frame("日文日期记忆助手");
f.setLayout(new FlowLayout());
f.setBounds(300,100,500,600);
f.setVisible(true);
l = new Label("中文");
l0 = new Label("日文");
tf_chn = new TextField("",55);
tf_jap = new TextField("",55);
btn_start = new Button("开始练习");
btn_check = new Button("正确/错误 ");
//btn_check.setLabel("正确");
btn_next = new Button("下一条");
btn_end = new Button("结束练习");
btn_showall = new Button("查看所有词条");
ta = new TextArea("",28,56);
tf_jap.setText("");
String howtouse = " *********记忆助手使用步骤**********\n1.点击“开始练习”按钮,中文部分文本框会随机出现一个单词,\n在日文文本框中输入对应的日语。\n2.点击“正确/错误”按钮,验证输入内容是否正确,如果输入\n正确,“正确/错误”按钮上面的文字会变成“正确”,如果输\n入错误,“正确/错误”按钮上面的文字会变成“错误”,验证\n的同时下方的文本框会给出正确答案。\n3.点击“下一条”按钮,出现一个新的中文单词,后面按照步\n骤2中的步骤重复。\n4.点击“结束练习”按钮,所有的文本框会清空。\n5.点击“查看所有”按钮,下方的多行文本框会列出数据库中\n收录的所有词条。\n";
ta.setText(howtouse);
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.out.println("exiting...");
System.exit(0);
}
});
// 设置开始,下一条,查看收录的事件监听
//tf_jap.setText("");
btn_start.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
MemoryWordsImplement mw = new MemoryWordsImplement();
idArray = mw.StartBtn();
contentArray = mw.Nextbtn(idArray);
String chn = contentArray.get(0);
tf_chn.setText(chn);
}
});
btn_next.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
MemoryWordsImplement mw = new MemoryWordsImplement();
contentArray = null;
//idArray = mw.StartBtn();
try {
contentArray = mw.Nextbtn(idArray);
String chn = contentArray.get(0);
tf_chn.setText(chn);
btn_check.setLabel("正确/错误");//设置按钮文字
String jap = tf_jap.getText();//获取文本框内容
//System.out.println(chn+jap);
tf_jap.setText("");
//System.out.println(chn+jap);
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
btn_check.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
MemoryWordsImplement mw = new MemoryWordsImplement();
Boolean flag = true;
try {
if(contentArray.size()!= 0){
//ArrayList<String> contentArray = mw.Nextbtn(idArray);
String jap = contentArray.get(1);
String answer = tf_jap.getText().trim(); //用trim()方法出去字符串首尾的空格,因为录入或填写答案时会不自知的按下空格,导致判断结果出错
String cort = "正确答案:"+contentArray.get(0)+"\t\t"+jap;
if(answer.equals(jap)){
btn_check.setLabel("正确");
ta.setText(cort);
}else{
btn_check.setLabel("错误");
ta.setText(cort);
flag = false;
}
System.out.println("flag="+flag);
mw.RightOrWrong(contentArray, flag);
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
// 设置结束按钮监听事件,清空界面所有数据
btn_end.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
idArray = null;
contentArray = null;
tf_chn.setText("");
tf_jap.setText("");
ta.setText("");
btn_check.setLabel("正确/错误");
}
});
//与 memorywords.dao.impl.MemoryWordsImplement。java中的FindAll()方法关联;
btn_showall.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
MemoryWords mw = new MemoryWordsImplement();
//用String。format格式化文本内容,是文本内容更整齐,下面是统一左对齐
String no = String.format("%-5s", "编号");
String chn = String.format("%-10s", "中文");
String jap = String.format("%-10s", "日文");
String apeartime = String.format("%-5s", "出现");
String righttime = String.format("%-5s", "答对");
String wrongtime = String.format("%-5s", "答错");
String title = no+"\t"+chn+"\t"+jap+"\t"+apeartime+"\t"+righttime+"\t"+wrongtime+"\n";;
allinfo = mw.FindAll();
ta.setText(title+allinfo);
}
});
//将所有的窗体部件全部添加到窗体中
f.add(l);
f.add(tf_chn);
f.add(l0);
f.add(tf_jap);
f.add(btn_start);
f.add(btn_check);
f.add(btn_next);
f.add(btn_end);
f.add(btn_showall);
f.add(ta);
System.out.println("ok...");
}
public static void main(String[] args){
new MemoryWordsGui();
}
}