文章目录

  • 1. 题目
  • 2. 项目结构层次
  • 3. 环境以及技术栈说明
  • 4. 项目报告
    • 4.1软件功能描述
    • 4.2项目类图
      • 4.2.1 `src`层级下的类图
      • 4.2.2 `data`层级下的类图
      • 4.2.3 `gui`层级下的类图
      • 4.2.4 `resource`层级下的类图
      • 4.2.5 `view`层级下的类图
      • 4.2.6 `DelWord`的类图
      • 4.2.7 `CustomMessageDialog`的类图
      • 4.2.8 `RoundBorder`的类图
      • 4.2.9 `AddWordView`的类图
      • 4.2.10 `BackgroundPanel`的类图
      • 4.2.11 `DeleteWordView`的类图
      • 4.2.12 `HandleAddWord`的类图
      • 4.2.13 `HandleDelWord`的类图
      • 4.2.14 `HandleQueryAllWord`的类图
      • 4.2.15 `HandleQueryOneWord`的类图
      • 4.2.16 `HandleRandomQueryWord`的类图
      • 4.2.17 `HandleUpdateWord`的类图
      • 4.2.18 `IntergrationView`的类图
      • 4.2.19 `QueryAllWordView`的类图
      • 4.2.20 `QueryOneWordView`的类图
      • 4.2.21 `RandomQueryView`的类图
      • 4.2.22 `UpdateWordView`的类图
    • 4.3 运行效果截图
      • 4.3.1 页面UI
      • 4.3.2 运行样例
    • 4.4 技术说明
    • 4.5 改进说明
  • 5. 全部源码(很多注释)
    • 5.1 AddWord.java
    • 5.2 ConnectDatabase.java
    • 5.3 CreateDatabaseAndTable.java
    • 5.4 DelWord.java
    • 5.5 QueryAllWord.java
    • 5.6 QueryOneWord.java
    • 5.7 RandomQueryWord.java
    • 5.8 UpdateWord.java
    • 5.9 Word.java
    • 5.10 AppWindow.java
    • 5.11 CustomMessageDialog.java
    • 5.12 FontLoader.java
    • 5.13 RoundBorder.java
    • 5.14 AddWordView.java
    • 5.15 BackgroundPanel.java
    • 5.16 DelWordView.java
    • 5.17 HandleAddWord.java
    • 5.18 HandleDelWord.java
    • 5.19 HandleQueryAllWord.java
    • 5.20 HandleQueryOneWord.java
    • 5.21 HandleRandomQueryWord.java
    • 5.22 HandleUpdateWord.java
    • 5.23 IntegrationView.java
    • 5.24 QueryAllWordView.java
    • 5.25 QueryOneWordView.java
    • 5.26 RandomQueryView.java
    • 5.27 UpdateWordView.java
  • 结语

1. 题目

应用面向对象技术,参考《Java 面向对象程序设计》第3版第17章《基于嵌入式数据库的单词字典》程序,改进一个系统。


2. 项目结构层次

简单目录说明:

  • 该项目所有的依赖库在FianlDesign/lib文件下包括BeautyEyeApache Derby
  • FinalDesign/src文件夹主要是存放.java源文件的
  • FinalDesign/img文件夹存放该项目所需的图片.png
  • FianlDesign/font文件夹存放外部字体,该项目所用的字体统一为 阿里妈妈黑体
├─.idea
│  │  .gitignore
│  │  misc.xml
│  │  modules.xml
│  │  workspace.xml
│  │
│  └─libraries
│          .xml
│
├─fonts
│      Alimama.otf
│      Alimama.ttf
│
├─img
│      addVoca.png
│      BCG.png
│      deleteVoca.png
│      queryAllVoca.png
│      queryOneVoca.png
│      queryRandomVoca.png
│      updateVoca.png
│      穷词logo.png
│
├─lib
│      beautyeye_lnf.jar
│      derby.jar
│
├─MyEnglishBook
│  │  db.lck
│  │  README_DO_NOT_TOUCH_FILES.txt
│  │  service.properties
│  │
│  ├─log
│  │      log.ctrl
│  │      log1.dat
│  │      logmirror.ctrl
│  │      README_DO_NOT_TOUCH_FILES.txt
│  │
│  ├─seg0
│  │      c10.dat
│  │      ..........
│  │      README_DO_NOT_TOUCH_FILES.txt
│  │
│  └─tmp
├─out
│  └─production
│      └─FinalDesign
│
└─src├─data│      AddWord.java│      ConnectDatabase.java│      CreateDatabaseAndTable.java│      DelWord.java│      QueryAllWord.java│      QueryOneWord.java│      RandomQueryWord.java│      UpdateWord.java│      Word.java│      ├─gui│      AppWindow.java│      ├─resource│      CustomMessageDialog.java│      FontLoader.java│      RoundBorder.java│      └─viewAddWordView.javaBackgroundPanel.javaDelWordView.javaHandleAddWord.javaHandleDelWord.javaHandleQueryAllWord.javaHandleQueryOneWord.javaHandleRandomQueryWord.javaHandleUpdateWord.javaIntegrationView.javaQueryAllWordView.javaQueryOneWordView.javaRandomQueryView.javaUpdateWordView.java

3. 环境以及技术栈说明

JDK请使用1.8版本的,若版本不一很可能会引发两个依赖库BeautyEyeDerby的冲突,具体展示如下图

该项目涉及的技术栈:

  1. Apache Derby()
  2. BeautyEye
  3. JAVA Swing

使用的集成开放环境是idea


4. 项目报告

4.1软件功能描述

  • 项目名称: 穷词-基于嵌入式的数据库的单词字典

  • 实验内容: 使用derby+BeautyEye来完成一个单词字典的软件开发

  • 软件功能描述: 用户可以使用该软件来达到使用本地字典的功能,随着时间的推移和数据库中不断新增的记录,这个字典会越来越完善,如今具有添加单词修改单词删除单词查询一个单词浏览全部单词随机查看单词。这六个功能,页面UI整体是以武侠为主线。

4.2项目类图

先展示的是src层级下的各个大类的类图

4.2.1 src层级下的类图

4.2.2 data层级下的类图

4.2.3 gui层级下的类图

4.2.4 resource层级下的类图

4.2.5 view层级下的类图

接下来展示各个子类的类图,若该子类的类图只有自己则不会展示

4.2.6 DelWord的类图

4.2.7 CustomMessageDialog的类图

4.2.8 RoundBorder的类图

4.2.9 AddWordView的类图

4.2.10 BackgroundPanel的类图

4.2.11 DeleteWordView的类图

4.2.12 HandleAddWord的类图

4.2.13 HandleDelWord的类图

4.2.14 HandleQueryAllWord的类图

4.2.15 HandleQueryOneWord的类图

4.2.16 HandleRandomQueryWord的类图

4.2.17 HandleUpdateWord的类图

4.2.18 IntergrationView的类图

4.2.19 QueryAllWordView的类图

4.2.20 QueryOneWordView的类图

4.2.21 RandomQueryView的类图

4.2.22 UpdateWordView的类图

4.3 运行效果截图

4.3.1 页面UI

4.3.2 运行样例


4.4 技术说明

这个软件总体是按照MVC模式来进行设计的。

  1. 符合单一原则(Single Responsibility Principle一个类只负责一个职责,如AddWordView等职责都是创建添加单词页面视图等,而HandleAddWord等职责都是负责控制页面视图和提交到数据库等;
  2. 符合开闭原则(Open Close Principle)对拓展开放对修改关闭;
  3. 符合里氏替换原则(Liskov Substitution Principle),没有子类覆盖父类的抽象方法,只有实现其抽象方法,并且子类可以增加自己特有的方法。
  4. 符合依赖倒置原则(Dependence Inversion Principle)虽然这个项目没有使用抽象类或者接口,但是有对接口进行实现。
  5. 符合迪米特法则(Law Of Demeter),一个类不会与与它无关的类进行交流沟通。
  6. 符合组合/聚合复用原则(Composition/Aggregation Reuse Principle )——松耦合,个别类使用了合成和聚合来达到实现功能的目的而不是使用集成。

4.5 改进说明

  1. 使用国人开发的Beautyeye外部Swing库来进行页面的UI改进前端。
  2. 使用derby内嵌式数据库来作为后端。
  3. 重新排版了各个视图的输入框、按钮、标签等,使得其看起来更加优美
  4. 优化了触发逻辑,查询之前检查输入框是否为空、查找失败后反馈信息、删除成功清空输入框等等
  5. 使用Midjourney来设计的产品logo武侠背景图
  6. 自己造CustomMessageDialog\FontLoader\RoundBorder等轮子来达到优化页面的目的
  7. 自建一个MaskLayer类来达到切换选项卡时启动遮罩层的目的(目前已废弃,由于切换选项卡时有些输入框并没有被遮罩层覆盖)
    原MaskLayer类

    package src.resource;import javax.swing.*;
    import java.awt.*;public class MaskLayer extends JComponent {private static final Color MASK_COLOR = new Color(0, 0, 0, 150);@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);// 绘制半透明磨砂板Graphics2D g2d = (Graphics2D) g.create();g2d.setColor(MASK_COLOR);g2d.fillRect(0, 0, getWidth(), getHeight());g2d.dispose();}
    }
    

    原IntergrationView类

    package src.view;//包名import src. resource.MaskLayer;
    import src.resource.FontLoader;
    import src.resource.RoundBorder;import javax.swing.*;//导入javax.swing包中的所有类
    import java.awt.*;//导入java.awt包中的所有类
    import java.awt.event.ActionEvent;public class AddWordView extends JPanel {//添加单词界面private MaskLayer maskLayer;//遮罩层private Timer timer;//计时器JTextField inputWord;     //输入单词JTextField inputMeaning;  //输入单词的解释JCheckBox Verb, Noun, adj;     //输入单词的词性JButton submit;           //提交按钮JLabel wordLabel, meaningLabel, partLabel;//单词标签,解释标签,词性标签HandleAddWord handleAddWord;  //负责处理添加单词JPanel inputPanel, checkBoxPanel, submitPanel;//输入面板,复选框面板,提交面板AddWordView() {//添加单词界面,构造方法initView();//初始化界面registerListener();//注册监听器setLayout(new BorderLayout()); // 设置布局为边界布局add(maskLayer, BorderLayout.CENTER); // 将 MaskLayer 添加到中间位置maskLayer = new MaskLayer();//创建遮罩层maskLayer.setBackground(new Color(0, 0, 0, 150));//设置遮罩层背景颜色maskLayer.setBounds(0, 0, 800, 560);//设置遮罩层位置和大小// 添加其他组件到 maskLayer 上maskLayer.add(inputPanel);maskLayer.add(submitPanel);timer = new Timer(500, new AbstractAction() {@Overridepublic void actionPerformed(ActionEvent e) {maskLayer.hideMaskLayer();timer.stop();}});}private void initView() {setBackground(new Color(0, 0, 0, 0));//设置背景透明Box boxH, boxHThree, boxHFour;                 //行式盒Box boxVOne, boxVTwo;      //列式盒boxH = Box.createHorizontalBox();//创建行式盒boxVOne = Box.createVerticalBox();//创建列式盒1boxVTwo = Box.createVerticalBox();//创建列式盒2boxHThree = Box.createHorizontalBox();//创建列式盒3boxHFour = Box.createHorizontalBox();//创建列式盒4boxH.setPreferredSize(new Dimension(400, 167));//设置行式盒大小boxHFour.setPreferredSize(new Dimension(400, 180));//设置行式盒4大小boxVOne.setPreferredSize(new Dimension(100, 167));//设置列式盒1大小boxVTwo.setPreferredSize(new Dimension(300, 167));//设置列式盒2大小//初始化组件inputWord = new JTextField(30);//输入单词输入框inputWord.setFont(FontLoader.getCustomFont(15));//设置输入单词输入框字体inputMeaning = new JTextField(30);//输入单词的解释输入框inputMeaning.setFont(FontLoader.getCustomFont(15));//设置输入单词的解释输入框字体Verb = new JCheckBox("动词");//动词复选框Verb.setFont(FontLoader.getCustomFont(17));//设置动词复选框字体Verb.setBackground(new Color(0, 0, 0, 0));//设置动词复选框背景透明Verb.setForeground(Color.BLACK);//设置动词复选框字体颜色Noun = new JCheckBox("名词");//名词复选框Noun.setFont(FontLoader.getCustomFont(17));//设置名词复选框字体Noun.setBackground(new Color(0, 0, 0, 0));//设置名词复选框背景透明Noun.setForeground(Color.DARK_GRAY);//设置名词复选框字体颜色adj = new JCheckBox("形容词");//形容词复选框adj.setFont(FontLoader.getCustomFont(17));//设置形容词复选框字体adj.setBackground(new Color(0, 0, 0, 0));//设置形容词复选框背景透明adj.setForeground(Color.WHITE);//设置形容词复选框字体颜色submit = new JButton("点击此处添加单词") {@Override//重写paintComponent方法,使按钮当前图层透明protected void paintComponent(Graphics g) {// TODO Auto-generated method stubGraphics2D g2d = (Graphics2D) g.create();g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));super.paintComponent(g2d);g2d.dispose();}};submit.setFont(FontLoader.getCustomFont(20));//设置提交按钮字体submit.setBorderPainted(false); //不绘制边框submit.setForeground(Color.BLACK); //设置字体颜色submit.setContentAreaFilled(false); //不绘制按钮区域wordLabel = new JLabel("单词:");//单词标签wordLabel.setFont(FontLoader.getCustomFont(30));//设置单词标签字体meaningLabel = new JLabel("解释:");//解释标签meaningLabel.setFont(FontLoader.getCustomFont(30));//设置解释标签字体partLabel = new JLabel("词性:");//词性标签partLabel.setFont(FontLoader.getCustomFont(30));//设置词性标签字体//往列式盒添加组件,分为两列boxVOne.add(wordLabel);//单词标签boxVOne.add(Box.createVerticalStrut(20));//创建垂直间距boxVOne.add(meaningLabel);//解释标签boxVOne.add(Box.createVerticalStrut(20));//创建垂直间距boxVOne.add(partLabel);//词性标签checkBoxPanel = new JPanel();checkBoxPanel.setBackground(new Color(0, 0, 0, 0));checkBoxPanel.add(boxHThree);boxHThree.add(Verb);boxHThree.add(Box.createHorizontalStrut(10));//创建水平间距boxHThree.add(Noun);boxHThree.add(Box.createHorizontalStrut(10));//创建水平间距boxHThree.add(adj);boxVTwo.add(inputWord);//单词输入框boxVTwo.add(Box.createVerticalStrut(10));//创建垂直间距boxVTwo.add(inputMeaning);//单词解释输入框boxVTwo.add(Box.createVerticalStrut(10));//创建垂直间距boxVTwo.add(checkBoxPanel);//词性复选框boxH.add(boxVOne);boxH.add(Box.createHorizontalStrut(10));//创建水平间距boxH.add(boxVTwo);inputPanel = new JPanel();inputPanel.setBackground(new Color(0, 0, 0, 0));inputPanel.setBorder(new RoundBorder(Color.black));inputPanel.add(boxH);boxHFour.add(submit);submitPanel = new JPanel();submitPanel.setBackground(new Color(0, 0, 0, 0));submitPanel.setLayout(new BoxLayout(submitPanel, BoxLayout.Y_AXIS));submitPanel.add(Box.createVerticalStrut(120));//创建垂直间距submitPanel.add(boxHFour);add(inputPanel);add(submitPanel);}private void registerListener() {//注册监听器handleAddWord = new HandleAddWord();//创建监听器对象,负责处理添加单词handleAddWord.setView(this);//设置监听器对象的界面,即AddWordView对象submit.addActionListener(handleAddWord);//注册监听器}
    }
    

5. 全部源码(很多注释)

超长代码警告!!!

5.1 AddWord.java

package src.data;//包名
import java.sql.*;//导入java.sql包中的所有类
public class AddWord {//添加单词int isOK ; //isOK=1表示添加成功,isOK=0表示添加失败public int insertWord(src.data.Word word) {//插入单词方法Connection con = ConnectDatabase.connectDatabase();//连接MyEnglishBook数据库if(con == null)//如果连接失败,返回0return 0;try { String SQL ="insert into word_table values(?,?)";//插入单词SQL语句PreparedStatement sta  = con.prepareStatement(SQL);//创建PreparedStatement对象sta.setString(1,word.getEnglishWord());//设置SQL语句中的第一个问号的值sta.setString(2,word.getMeaning());//设置SQL语句中的第二个问号的值isOK = sta.executeUpdate();  //执行SQL语句con.close();//关闭数据库连接}catch(SQLException e) {isOK = 0; //word_table表中word字段是主键,即不允许单词重复}return isOK;}
}

5.2 ConnectDatabase.java

package src.data;//包名
import java.sql.*;//导入java.sql包中的所有类public class ConnectDatabase{//连接数据库public static Connection connectDatabase() {Connection con = null;try{Class.forName("org.apache.derby.jdbc.EmbeddedDriver");}catch(Exception e){}try{  String uri ="jdbc:derby:MyEnglishBook;create=true";con=DriverManager.getConnection(uri);//连接数据库代码}catch(Exception e){}return con;}
}

5.3 CreateDatabaseAndTable.java

package src.data;// 包名
import java.sql.*;// 导入java.sql包中的所有类
public class CreateDatabaseAndTable{// 创建数据库和表Connection con;// 数据库连接对象public  CreateDatabaseAndTable(){try{Class.forName("org.apache.derby.jdbc.EmbeddedDriver");// 加载驱动}catch(Exception e){System.out.println("驱动加载失败"+e);// 如果驱动加载失败,将触发异常}try{ //创建名字是MyEnglishBook的数据库:String uri ="jdbc:derby:MyEnglishBook;create=true";// 数据库连接字符串con=DriverManager.getConnection(uri); //连接数据库代码}catch(Exception e){System.out.println("数据库连接失败"+e);// 如果数据库连接失败,将触发异常}// 如果数据库已经存在,将触发异常,不再创建该数据库try {//创建名字是word_table的表:Statement sta = con.createStatement();//创建Statement对象String SQL="create table word_table"+"(word varchar(50) primary key,meaning varchar(200))";//创建表的SQL语句sta.executeUpdate(SQL);   //创建表con.close();//关闭数据库连接}catch(SQLException e) { //如果表已经存在,将触发SQL异常,不再创建该表System.out.println("表已经存在"+e);}}
}

5.4 DelWord.java

package src.data;//包名
import java.sql.*;//导入java.sql包中的所有类
public class DelWord extends ConnectDatabase {//删除单词int isOK ; //isOK=1表示删除成功,isOK=0表示删除失败public int delWord(Word word) {//删除单词方法Connection con = ConnectDatabase.connectDatabase();//连接MyEnglishBook数据库if(con == null)//如果连接失败,返回0return 0;try { //删除单词SQL语句String SQL ="delete from word_table where word = ? ";PreparedStatement sta  = con.prepareStatement(SQL);//创建PreparedStatement对象sta.setString(1,word.getEnglishWord());//设置SQL语句中的第一个问号的值isOK = sta.executeUpdate();//执行SQL语句con.close();//关闭数据库连接}catch(SQLException e) {isOK = 0; //word_table表中word字段是主键,即不允许单词重复}return isOK;}
}

5.5 QueryAllWord.java

package src.data;//包名
import java.sql.*;//导入java.sql包中的所有类
public class QueryAllWord {//查询全部单词public Word[] queryAllWord() { //查询全部单词方法Connection con = ConnectDatabase.connectDatabase();//连接MyEnglishBook数据库if(con == null)//如果连接失败,返回nullreturn null;Word [] word  = null;//Word数组Statement sql; //Statement对象是用于执行静态SQL语句并返回它所生成结果的对象ResultSet rs;//ResultSet对象是用于保存获取的结果集的对象try { //查询全部单词SQL语句若不加order by子句,结果集中的记录顺序是不确定的sql=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);//创建Statement对象rs=sql.executeQuery("select * from word_table");//执行SQL语句rs.last(); //结果集指针移到最后一条记录int recordAmount =rs.getRow();//结果集中的全部记录word = new Word[recordAmount];//Word数组的长度for(int i=0;i<word.length;i++){word[i] = new Word();//Word数组的每个元素}rs.beforeFirst();//结果集指针移到第一条记录之前int i=0;//Word数组的下标while(rs.next()) { //遍历结果集word[i].setEnglishWord(rs.getString(1));//设置Word数组的每个元素的单词word[i].setMeaning(rs.getString(2));//设置Word数组的每个元素的单词解释i++;}con.close();}catch(SQLException e) {}return word;//返回Word数组}
}

5.6 QueryOneWord.java

package src.data;
import java.sql.*;
public class QueryOneWord {//查询单词public Word queryOneWord(Word word) {//查询单词方法Connection con = ConnectDatabase.connectDatabase();//连接MyEnglishBook数据库if(con == null)return null;Word  foundWord  = null;//查询到的单词Statement sql; //创建Statement对象ResultSet rs;//创建ResultSet对象String str ="select * from word_table where word ='"+word.getEnglishWord()+"'"; //查询单词SQL语句try { //执行SQL语句sql=con.createStatement();rs=sql.executeQuery(str);if(rs.next()){ //如果查询到单词foundWord = new Word();//查询到的单词foundWord.setEnglishWord(rs.getString(1));//设置查询到的单词foundWord.setMeaning(rs.getString(2));//设置查询到的单词解释}con.close();}catch(SQLException e) {}return foundWord;}
}

5.7 RandomQueryWord.java

package src.data;//包名
import java.sql.*;//导入java.sql包中的所有类
import java.util.*;//导入java.util包中的所有类
public class RandomQueryWord {//随机抽取单词int count =0 ;//随机抽取的数目public void setCount(int n){count = n;}//设置随机抽取的数目public int getCount(){return count;}//得到随机抽取的数目public Word[] randomQueryWord() { //随机抽取单词方法Connection con = ConnectDatabase.connectDatabase();//连接MyEnglishBook数据库if(con == null)return null;Word [] word  = null;//存放随机抽取的单词Statement sql; ResultSet rs;try { sql=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);//创建Statement对象rs=sql.executeQuery("select * from word_table");//执行SQL语句rs.last(); //结果集指针移到最后一条记录int recordAmount =rs.getRow();//结果集中的记录数目count = Math.min(count,recordAmount);//随机抽取的数目不能超过结果集中的记录数目word = new Word[count];//Word数组的长度for(int i=0;i<word.length;i++){word[i] = new Word();}//得到1至recordAmount之间count个互不相同的随机整数(存放在数组index中):int [] index = getRandomNumber(recordAmount,count);int m = 0;for(int randomNumer:index){ // randomNumer依次取数组index每个单元的值rs.absolute(randomNumer);//查询游标移动到第randomNumer行word[m].setEnglishWord(rs.getString(1));word[m].setMeaning(rs.getString(2));m++;}con.close();}catch(SQLException e) { System.out.println(e);}return word;} public int [] getRandomNumber(int max,int count) {//得到1至max之间count个互不相同的随机整数// 得到1至max之间的amount个互不相同的随机整数(包括1和max):int [] randomNumber = new int[count];Set<Integer> set=new HashSet<Integer>(); //set不允许有相同的元素int size =set.size();Random random = new Random();while(size<count){int number = random.nextInt(max)+1;set.add(number); //number放入集合set中size =set.size();//集合set的大小}Iterator<Integer> iter=set.iterator();int i = 0;while(iter.hasNext()) {  //把集合中的随机数放入数组Integer te=iter.next();randomNumber[i] = te.intValue();i++;}return  randomNumber;}
}

5.8 UpdateWord.java

package src.data;//包名
import java.sql.*;//导入java.sql包中的所有类
public class UpdateWord {//更新单词int isOK  ; public int updateWord(Word word) {//更新单词方法Connection con = ConnectDatabase.connectDatabase();//连接MyEnglishBook数据库if(con == null)return 0;try { String SQL ="update word_table set meaning = ? where word = ? ";//更新单词SQL语句PreparedStatement sta  = con.prepareStatement(SQL);sta.setString(1,word.getMeaning());//设置SQL语句中的第一个问号的值sta.setString(2,word.getEnglishWord());//设置SQL语句中的第二个问号的值isOK = sta.executeUpdate();//执行SQL语句con.close();}catch(SQLException e) {isOK = 0; }return isOK;}
}

5.9 Word.java

package src.data;
public class Word{String englishWord; //单词String meaning;    //单词的解释public void setEnglishWord(String englishWord){this.englishWord = englishWord;}//设置单词public String getEnglishWord() {return englishWord;}//获取单词public void setMeaning(String meaning){this.meaning = meaning;}//设置单词解释public String getMeaning() {return meaning;}//获取单词解释
}

5.10 AppWindow.java

package src.gui;import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper;
import src.view.IntegrationView;
import src.data.CreateDatabaseAndTable;import java.awt.*;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.plaf.BorderUIResource;public class AppWindow {//应用程序窗口public static void main(String[] args) {//加载Beautyeyetry {org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF();//设置BeautyEyeLNFBeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.osLookAndFeelDecorated;//UIManager.put("RootPane.setupButtonVisible", false);//隐藏设置按钮UIManager.put("ToolBar.isPaintPlainBackground", Boolean.TRUE);//自定义JToolBar ui的borderBorder bd = new org.jb2011.lnf.beautyeye.ch8_toolbar.BEToolBarUI.ToolBarBorder(UIManager.getColor("ToolBar.shadow")     //Floatable时触点的颜色, UIManager.getColor("ToolBar.highlight")//Floatable时触点的阴影颜色, new Insets(16, 40, 0, 20));              //border的默认insetsUIManager.put("ToolBar.border", new BorderUIResource(bd));//改变InsetsUIResource参数的值即可实现UIManager.put("TabbedPane.tabAreaInsets", new javax.swing.plaf.InsetsUIResource(8, 5, 0, 0));} catch (Exception e) {System.out.println("BeautyEyeLNF not found!");//未找到BeautyEyeLNF}new CreateDatabaseAndTable();//创建数据库和表IntegrationView win = new IntegrationView(); //创建应用程序窗口}
}

5.11 CustomMessageDialog.java

package src.resource;import javax.swing.*;
import java.awt.*;public class CustomMessageDialog extends JDialog {public CustomMessageDialog(Frame parent, String message, String title, int messageType) {super(parent, title, true);JPanel contentPane = new JPanel() {@Overrideprotected void paintComponent(Graphics g) {//重写paintComponent方法,实现自定义的背景// Set the desired background color or imageg.setColor(Color.BLUE);g.fillRect(0, 0, getWidth(), getHeight());}};contentPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));contentPane.setLayout(new BorderLayout());// Add the message label to the panelJLabel messageLabel = new JLabel(message);messageLabel.setForeground(Color.WHITE);messageLabel.setHorizontalAlignment(SwingConstants.CENTER);contentPane.add(messageLabel, BorderLayout.CENTER);// Set the custom panel as the content pane of the dialogsetContentPane(contentPane);// Set the dialog size based on the message lengthint messageLength = message.length();int dialogWidth = Math.min(400, messageLength * 10);int dialogHeight = 150;setSize(dialogWidth, dialogHeight);setLocationRelativeTo(parent);// Set the appropriate message iconif (messageType == JOptionPane.ERROR_MESSAGE) {setIconImage(new ImageIcon("error_icon.png").getImage());} else if (messageType == JOptionPane.INFORMATION_MESSAGE) {setIconImage(new ImageIcon("info_icon.png").getImage());} else if (messageType == JOptionPane.WARNING_MESSAGE) {setIconImage(new ImageIcon("warning_icon.png").getImage());}// Set the dialog to dispose on closesetDefaultCloseOperation(DISPOSE_ON_CLOSE);}}

5.12 FontLoader.java

package src.resource;import java.awt.*;
import java.io.File;
import java.io.IOException;public class FontLoader {private static Font customFont;public static void loadFont() {try {File fontFile = new File("fonts/Alimama.ttf");customFont = Font.createFont(Font.TRUETYPE_FONT, fontFile);} catch (IOException | FontFormatException e) {e.printStackTrace();}}public static Font getCustomFont(float size) {if (customFont == null) {loadFont();}return customFont.deriveFont(size);}
}

5.13 RoundBorder.java

package src.resource;import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import javax.swing.border.Border;public class RoundBorder implements Border {private Color color;private int arcH = 15;private int arcW = 15;public RoundBorder() {this(Color.BLACK);// 如果实例化时,没有传值// 默认是黑色边框}public RoundBorder(Color color) {this.color = color;}public Insets getBorderInsets(Component c) {// top:可以调节光标与边枉的距离, 间接影响高度// left:可以调节光标与边枉的距离// bottom:可以调节光标与边枉的距离, 间接影响高度// right:可以调节光标与边枉的距离return new Insets(10, 15, 10, 15);}public boolean isBorderOpaque() {return false;}// 实现Border(父类)方法@Overridepublic void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {//        g.setColor(color);//        g.drawRoundRect(0, 0, c.getWidth() - 1, c.getHeight() - 1, arcH, arcW);Graphics2D g2d = (Graphics2D) g.create();g2d.setColor(color);g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2d.drawRoundRect(0, 0, c.getWidth() - 1, c.getHeight() - 1, arcH, arcW);g2d.dispose();}
}

5.14 AddWordView.java

package src.view;//包名import src.resource.FontLoader;
import src.resource.RoundBorder;import javax.swing.*;//导入javax.swing包中的所有类
import java.awt.*;//导入java.awt包中的所有类public class AddWordView extends JPanel {//添加单词界面JTextField inputWord;     //输入单词JTextField inputMeaning;  //输入单词的解释JCheckBox Verb, Noun, adj;     //输入单词的词性JButton submit;           //提交按钮JLabel wordLabel, meaningLabel, partLabel;//单词标签,解释标签,词性标签HandleAddWord handleAddWord;  //负责处理添加单词JPanel inputPanel, checkBoxPanel, submitPanel;//输入面板,复选框面板,提交面板AddWordView() {//添加单词界面,构造方法initView();//初始化界面registerListener();//注册监听器}private void initView() {setBackground(new Color(0, 0, 0, 0));//设置背景透明Box boxH, boxHThree, boxHFour;                 //行式盒Box boxVOne, boxVTwo;      //列式盒boxH = Box.createHorizontalBox();//创建行式盒boxVOne = Box.createVerticalBox();//创建列式盒1boxVTwo = Box.createVerticalBox();//创建列式盒2boxHThree = Box.createHorizontalBox();//创建列式盒3boxHFour = Box.createHorizontalBox();//创建列式盒4boxH.setPreferredSize(new Dimension(400, 167));//设置行式盒大小boxHFour.setPreferredSize(new Dimension(400, 180));//设置行式盒4大小boxVOne.setPreferredSize(new Dimension(100, 167));//设置列式盒1大小boxVTwo.setPreferredSize(new Dimension(300, 167));//设置列式盒2大小//初始化组件inputWord = new JTextField(30);//输入单词输入框inputWord.setFont(FontLoader.getCustomFont(15));//设置输入单词输入框字体inputMeaning = new JTextField(30);//输入单词的解释输入框inputMeaning.setFont(FontLoader.getCustomFont(15));//设置输入单词的解释输入框字体Verb = new JCheckBox("动词");//动词复选框Verb.setFont(FontLoader.getCustomFont(17));//设置动词复选框字体Verb.setBackground(new Color(0, 0, 0, 0));//设置动词复选框背景透明Verb.setForeground(Color.BLACK);//设置动词复选框字体颜色Noun = new JCheckBox("名词");//名词复选框Noun.setFont(FontLoader.getCustomFont(17));//设置名词复选框字体Noun.setBackground(new Color(0, 0, 0, 0));//设置名词复选框背景透明Noun.setForeground(Color.DARK_GRAY);//设置名词复选框字体颜色adj = new JCheckBox("形容词");//形容词复选框adj.setFont(FontLoader.getCustomFont(17));//设置形容词复选框字体adj.setBackground(new Color(0, 0, 0, 0));//设置形容词复选框背景透明adj.setForeground(Color.WHITE);//设置形容词复选框字体颜色submit = new JButton("点击此处添加单词") {@Override//重写paintComponent方法,使按钮当前图层透明protected void paintComponent(Graphics g) {// TODO Auto-generated method stubGraphics2D g2d = (Graphics2D) g.create();g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));super.paintComponent(g2d);g2d.dispose();}};submit.setFont(FontLoader.getCustomFont(20));//设置提交按钮字体submit.setBorderPainted(false); //不绘制边框submit.setForeground(Color.BLACK); //设置字体颜色submit.setContentAreaFilled(false); //不绘制按钮区域wordLabel = new JLabel("单词:");//单词标签wordLabel.setFont(FontLoader.getCustomFont(30));//设置单词标签字体meaningLabel = new JLabel("解释:");//解释标签meaningLabel.setFont(FontLoader.getCustomFont(30));//设置解释标签字体partLabel = new JLabel("词性:");//词性标签partLabel.setFont(FontLoader.getCustomFont(30));//设置词性标签字体//往列式盒添加组件,分为两列boxVOne.add(wordLabel);//单词标签boxVOne.add(Box.createVerticalStrut(20));//创建垂直间距boxVOne.add(meaningLabel);//解释标签boxVOne.add(Box.createVerticalStrut(20));//创建垂直间距boxVOne.add(partLabel);//词性标签checkBoxPanel = new JPanel();checkBoxPanel.setBackground(new Color(0, 0, 0, 0));checkBoxPanel.add(boxHThree);boxHThree.add(Verb);boxHThree.add(Box.createHorizontalStrut(10));//创建水平间距boxHThree.add(Noun);boxHThree.add(Box.createHorizontalStrut(10));//创建水平间距boxHThree.add(adj);boxVTwo.add(inputWord);//单词输入框boxVTwo.add(Box.createVerticalStrut(10));//创建垂直间距boxVTwo.add(inputMeaning);//单词解释输入框boxVTwo.add(Box.createVerticalStrut(10));//创建垂直间距boxVTwo.add(checkBoxPanel);//词性复选框boxH.add(boxVOne);boxH.add(Box.createHorizontalStrut(10));//创建水平间距boxH.add(boxVTwo);inputPanel = new JPanel();inputPanel.setBackground(new Color(0, 0, 0, 0));inputPanel.setBorder(new RoundBorder(Color.black));inputPanel.add(boxH);boxHFour.add(submit);submitPanel = new JPanel();submitPanel.setBackground(new Color(0, 0, 0, 0));submitPanel.setLayout(new BoxLayout(submitPanel, BoxLayout.Y_AXIS));submitPanel.add(Box.createVerticalStrut(120));//创建垂直间距submitPanel.add(boxHFour);add(inputPanel);add(submitPanel);}private void registerListener() {//注册监听器handleAddWord = new HandleAddWord();//创建监听器对象,负责处理添加单词handleAddWord.setView(this);//设置监听器对象的界面,即AddWordView对象submit.addActionListener(handleAddWord);//注册监听器}
}

5.15 BackgroundPanel.java

package src.view;import java.awt.*;import javax.swing.ImageIcon;
import javax.swing.JPanel;/*** 有背景图片的Panel类*/
public class BackgroundPanel extends JPanel {/****/private static final long serialVersionUID = -6352788025440244338L;private Image image = (Image) new ImageIcon("img\\BCG.png").getImage();// 固定背景图片,允许这个JPanel可以在图片上添加其他组件protected void paintComponent(Graphics g) {g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this);}
}

5.16 DelWordView.java

package src.view;//包名
import org.jb2011.lnf.beautyeye.ch3_button.BEButtonUI;
import src.resource.FontLoader;import javax.swing.*;//导入javax.swing包中的所有类
import java.awt.*;public class DelWordView extends JPanel {//删除单词界面JTextField inputWord;  //输入要删除的单词JLabel inputWordLabel; //输入单词标签JButton delete;        //提交按钮HandleDelWord handleDelWord;  //负责处理删除单词DelWordView(){//删除单词界面,构造方法initView();//初始化界面registerListener() ;//注册监听器}private void initView() {setBackground(new Color(0,0,0,0));//设置背景透明inputWord = new JTextField(12);//输入要删除的单词inputWord.setFont(FontLoader.getCustomFont(15));//设置输入要删除的单词字体inputWordLabel = new JLabel("输入要删除的单词");//输入单词标签inputWordLabel.setFont(FontLoader.getCustomFont(15));//设置输入单词标签字体delete = new JButton("删除单词");//提交按钮delete.setFont(FontLoader.getCustomFont(15));//设置提交按钮字体delete.setUI(new BEButtonUI().setNormalColor(BEButtonUI.NormalColor.red));//设置提交按钮颜色add(inputWordLabel);//输入单词标签add(Box.createHorizontalStrut(20));//水平间距add(inputWord);//单词输入框add(Box.createHorizontalStrut(20));//水平间距add(delete);//提交按钮}private void registerListener() {//注册监听器handleDelWord = new HandleDelWord();//创建监听器对象,负责处理删除单词handleDelWord.setView(this);//设置监听器对象的界面,即DelWordView对象,这样监听器对象就可以访问DelWordView对象的成员变量了delete.addActionListener(handleDelWord);//注册监听器}
}

5.17 HandleAddWord.java

package src.view;import java.awt.event.*;import src.data.*;
import src.resource.CustomMessageDialog;import javax.swing.*;public class HandleAddWord implements ActionListener {//负责处理添加单词AddWordView view;//添加单词界面public void actionPerformed(ActionEvent e) {//处理添加单词String englishWord = view.inputWord.getText();//获取输入的单词String meaning = view.inputMeaning.getText();//获取输入的单词的解释Boolean partIsVerb = view.Verb.isSelected();//获取单词的词性是否是动词Boolean partIsNoun = view.Noun.isSelected();//获取单词的词性是否是名词Boolean partIsAdj = view.adj.isSelected();//获取单词的词性是否是形容词if (partIsVerb) {//如果单词的词性是动词meaning += " v.";//在单词的解释后面加上v.}if (partIsNoun) {//如果单词的词性是名词if (partIsVerb) meaning += "&";meaning += " n.";//在单词的解释后面加上n.}if (partIsAdj) {//如果单词的词性是形容词if (partIsVerb || partIsNoun) meaning += "&";meaning += " adj.";//在单词的解释后面加上adj.}if (englishWord.length() == 0 || meaning.length() == 0) //如果输入的单词或者解释为空,就返回{JOptionPane.showMessageDialog(view, "添加失败,检查是否输入框为空", "Feedback", JOptionPane.INFORMATION_MESSAGE);return;}Word word = new Word();//单词对象AddWord addWord = new AddWord(); //负责添加单词的对象word.setEnglishWord(englishWord);//设置单词word.setMeaning(meaning);//设置单词的解释int isOK = addWord.insertWord(word);//向数据库中的表添加单词if (isOK != 0) {UIManager.put("RootPane.setupButtonVisible", false);UIManager.put("OptionPane.border", BorderFactory.createEmptyBorder());JOptionPane.showMessageDialog(view, "添加成功", "Feedback", JOptionPane.INFORMATION_MESSAGE);view.inputWord.setText("");view.inputMeaning.setText("");} else {UIManager.put("RootPane.setupButtonVisible", false);UIManager.put("OptionPane.border", BorderFactory.createEmptyBorder());JOptionPane.showMessageDialog(view, "添加失败,数据库中可能已存在该单词", "Feedback", JOptionPane.INFORMATION_MESSAGE);view.inputWord.setText("");view.inputMeaning.setText("");}}public void setView(src.view.AddWordView view) {this.view = view;}//设置监听器对象的界面,即AddWordView对象
}

5.18 HandleDelWord.java

package src.view;import java.awt.event.*;import src.data.*;import javax.swing.*;public class HandleDelWord implements ActionListener {//负责处理删除单词DelWordView view;//删除单词界面public void actionPerformed(ActionEvent e) {String englishWord = view.inputWord.getText();//获取输入的单词if (englishWord.length() == 0) { //如果输入的单词为空,就返回JOptionPane.showMessageDialog(view, "删除失败,请检输入框是否为空", "Feedback", JOptionPane.WARNING_MESSAGE);return;}Word word = new Word();//单词对象DelWord del = new DelWord();    //负责删除单词的对象word.setEnglishWord(englishWord); //删除单词int isOK = del.delWord(word);//从数据库中的表删除单词if (isOK != 0) {JOptionPane.showMessageDialog(view, "删除成功!", "Feedback", JOptionPane.INFORMATION_MESSAGE);view.inputWord.setText("");//清空输入单词的文本框} else {JOptionPane.showMessageDialog(view, "删除失败,数据库中没有该单词", "Feedback", JOptionPane.WARNING_MESSAGE);}}public void setView(DelWordView view) {this.view = view;}
}

5.19 HandleQueryAllWord.java

package src.view;
import java.awt.event.*;
import src.data.*;
public class HandleQueryAllWord implements ActionListener {//负责处理查询所有单词QueryAllWordView view ;//查询所有单词界面public void actionPerformed(ActionEvent e) {//处理查询所有单词view.showWord.setText("");//清空显示单词的文本域QueryAllWord query = new QueryAllWord();//查询对象Word [] result =query.queryAllWord();     //执行查询for(int i=0;i<result.length;i++){int m = i+1;//序号view.showWord.append(m+"."+result[i].getEnglishWord());//显示单词,每个单词前面加上序号view.showWord.append("   "+result[i].getMeaning());//显示单词的解释,每个单词的解释前面加上三个空格view.showWord.append("\n");   //换行}}public void setView(QueryAllWordView view) {this.view = view;}
}

5.20 HandleQueryOneWord.java

package src.view;import java.awt.event.*;import com.sun.javafx.image.BytePixelSetter;
import src.data.*;import javax.swing.*;public class HandleQueryOneWord implements ActionListener {//负责处理查询单词QueryOneWordView view;//查询单词界面public void actionPerformed(ActionEvent e) {//处理查询单词String englishWord = view.inputWord.getText();//获取输入的单词if (englishWord.length() == 0) {JOptionPane.showMessageDialog(view, "请输入要查询的单词", "提示", JOptionPane.WARNING_MESSAGE);return;}Word word = new Word();//单词对象word.setEnglishWord(englishWord);//设置单词QueryOneWord query = new QueryOneWord();//负责查询的对象Word result = query.queryOneWord(word);    //执行查询操作if (result == null) {JOptionPane.showMessageDialog(view, "没有找到该单词", "提示", JOptionPane.WARNING_MESSAGE);} else {JOptionPane.showMessageDialog(view, "查询成功", "提示", JOptionPane.WARNING_MESSAGE);view.showWord.setText("");//清空显示单词的文本域view.showWord.append(" " + result.getEnglishWord());//显示单词view.showWord.append("   " + result.getMeaning());view.showWord.append("\n");}}public void setView(QueryOneWordView view) {this.view = view;}
}

5.21 HandleRandomQueryWord.java

package src.view;
import java.awt.event.*;
import src.data.*;
public class HandleRandomQueryWord implements ActionListener {RandomQueryView view ;//查询随机单词界面public void actionPerformed(ActionEvent e) {view.showWord.setText("");//清空显示单词的文本域String n =view.inputQueryNumber.getText().trim();//获取输入的单词if(n.length()==0)return;int count = 0;try{count = Integer.parseInt(n);//将字符串转换成整数}catch(NumberFormatException exp){view.showWord.setText("请输入正整数");//如果输入的不是整数,就返回}RandomQueryWord random = new RandomQueryWord();//查询对象random.setCount(count); //随机抽取count个单词src.data.Word[] result = random.randomQueryWord();         //执行查询for(int i=0;i<result.length;i++){int m = i+1;view.showWord.append(m+"."+result[i].getEnglishWord());//显示单词view.showWord.append("   "+result[i].getMeaning());//显示单词的解释view.showWord.append("\n");   //换行}}public void setView(RandomQueryView view) {this.view = view;}
}

5.22 HandleUpdateWord.java

package src.view;import java.awt.event.*;import src.data.*;import javax.swing.*;public class HandleUpdateWord implements ActionListener {//负责处理更新单词UpdateWordView view;//更新单词界面public void actionPerformed(ActionEvent e) {if (e.getSource() == view.lookWord) {lookWord();//查找单词} else if (e.getSource() == view.submit) {updateWord();//更新单词}}private void updateWord() {//方法:更新单词String englishWord = view.inputWord.getText();String meaning = view.inputNewMeaning.getText();if (englishWord.length() == 0 || meaning.length() == 0) {JOptionPane.showMessageDialog(view, "更新失败,请检查输入框是否为空", "Feedback", JOptionPane.WARNING_MESSAGE);return;}Word word = new Word();UpdateWord update = new UpdateWord();//负责更新的对象word.setEnglishWord(englishWord);//设置单词word.setMeaning(meaning);//设置单词的解释int isOK = update.updateWord(word);   //跟新单词if (isOK != 0)JOptionPane.showMessageDialog(view, "更新成功!", "Feedback", JOptionPane.WARNING_MESSAGE);elseJOptionPane.showMessageDialog(view, "更新数据库失败", "Feedback", JOptionPane.WARNING_MESSAGE);}private void lookWord() {//方法:查找单词String englishWord = view.inputWord.getText();//获取输入的单词if (englishWord.length() == 0) //如果输入的单词为空,就返回{JOptionPane.showMessageDialog(view, "查询失败,请检输入框是否为空", "Feedback", JOptionPane.WARNING_MESSAGE);return;}Word word = new Word();word.setEnglishWord(englishWord);//设置单词QueryOneWord query = new QueryOneWord();//负责查询的对象Word result = query.queryOneWord(word);//查询单词if (result != null) {//如果单词在表里JOptionPane.showMessageDialog(view, "查询成功!", "Feedback", JOptionPane.INFORMATION_MESSAGE);view.inputNewMeaning.setText(result.getMeaning());//显示单词的解释} else//如果单词不在表里JOptionPane.showMessageDialog(view, "查询失败,数据库中没有该单词", "Feedback", JOptionPane.WARNING_MESSAGE);}public void setView(UpdateWordView view) {this.view = view;}//设置监听器对象的界面,即UpdateWordView对象
}

5.23 IntegrationView.java

package src.view;//包名import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper;
import src.resource.FontLoader;import java.awt.*;//导入java.awt包中的所有类
import javax.swing.*;//导入javax.swing包中的所有类public class IntegrationView extends JFrame {//集成视图JTabbedPane tabbedPane; //用选项卡集成下列各个视图AddWordView addWordView;//添加单词视图UpdateWordView updateWordView;//修改单词视图DelWordView delWordView;//删除单词视图QueryOneWordView oneWordView;//查询一个单词视图QueryAllWordView queryAllWordView;//浏览全部单词视图RandomQueryView queryRandomView;//随机查看单词视图public IntegrationView() {try {BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.osLookAndFeelDecorated;//BeautyEyeLNFHelper.launchBeautyEyeLNF();} catch (IllegalAccessError e) {//UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}//初始化界面setBounds(100, 100, 800, 560);//设置窗口位置和大小setTitle("穷词");//设置窗口标题setVisible(true);//setTitle("穷词");//设置窗口标题setResizable(false); //设置窗口不可改变大小setBackground(new Color(0, 0, 0, 0));//设置窗口背景透明setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口关闭时,程序结束ImageIcon icon = new ImageIcon("img\\穷词logo.png");//设置窗口图标setIconImage(icon.getImage());//设置窗口图标BackgroundPanel backgroundPanel = new BackgroundPanel();backgroundPanel.setBounds(0, 0, 800, 560);//设置面板位置和大小backgroundPanel.setLayout(null);//设置窗口布局tabbedPane = new JTabbedPane(JTabbedPane.TOP);//卡在上方,默认是JTabbedPane.TOPtabbedPane.setFont(FontLoader.getCustomFont(13));//设置字体addWordView = new AddWordView();//添加单词视图updateWordView = new UpdateWordView();//修改单词视图delWordView = new DelWordView();//删除单词视图oneWordView = new QueryOneWordView();//查询一个单词视图queryAllWordView = new QueryAllWordView();//浏览全部单词视图queryRandomView = new RandomQueryView();//随机查看单词视图//设置选项卡图标ImageIcon addVoca = new ImageIcon("img\\addVoca.png");Image addVocaImg = addVoca.getImage().getScaledInstance(20, 20, Image.SCALE_DEFAULT);ImageIcon icon1 = new ImageIcon(addVocaImg);ImageIcon delVoca = new ImageIcon("img\\deleteVoca.png");Image delVocaImg = delVoca.getImage().getScaledInstance(20, 20, Image.SCALE_DEFAULT);ImageIcon icon2 = new ImageIcon(delVocaImg);ImageIcon updateVoca = new ImageIcon("img\\updateVoca.png");Image updateVocaImg = updateVoca.getImage().getScaledInstance(20, 20, Image.SCALE_DEFAULT);ImageIcon icon3 = new ImageIcon(updateVocaImg);ImageIcon queryOneVoca = new ImageIcon("img\\queryOneVoca.png");Image queryOneVocaImg = queryOneVoca.getImage().getScaledInstance(20, 20, Image.SCALE_DEFAULT);ImageIcon icon4 = new ImageIcon(queryOneVocaImg);ImageIcon queryAllVoca = new ImageIcon("img\\queryAllVoca.png");Image queryAllVocaImg = queryAllVoca.getImage().getScaledInstance(20, 20, Image.SCALE_DEFAULT);ImageIcon icon5 = new ImageIcon(queryAllVocaImg);ImageIcon queryRandomVoca = new ImageIcon("img\\queryRandomVoca.png");Image queryRandomVocaImg = queryRandomVoca.getImage().getScaledInstance(20, 20, Image.SCALE_DEFAULT);ImageIcon icon6 = new ImageIcon(queryRandomVocaImg);//添加到选项卡tabbedPane.addTab("添加单词", icon1, addWordView); //添加单词视图tabbedPane.addTab("修改单词", icon3, updateWordView); //修改单词视图tabbedPane.addTab("删除单词", icon2, delWordView);//删除单词视图tabbedPane.addTab("查询一个单词", icon4, oneWordView); //查询一个单词视图tabbedPane.addTab("浏览全部单词", icon5, queryAllWordView);//浏览全部单词视图tabbedPane.addTab("随机查看单词", icon6, queryRandomView); //随机查看单词视图tabbedPane.validate();//验证tabbedPane.setBounds(0, 0, 800, 560);//设置选项卡位置和大小tabbedPane.setBackground(new Color(0, 0, 0, 0));//设置选项卡背景透明backgroundPanel.add(tabbedPane);//添加到面板add(backgroundPanel);//添加到窗口validate();//验证}
}

5.24 QueryAllWordView.java

package src.view;import org.jb2011.lnf.beautyeye.ch3_button.BEButtonUI;
import src.resource.FontLoader;import java.awt.*;
import javax.swing.*;public class QueryAllWordView extends JPanel {JButton inquire;       //查询按钮JTextArea showWord;  //显示查询结果HandleQueryAllWord handleQueryAllWord;//负责处理查询全部单词QueryAllWordView() {initView();registerListener();}public void initView() {setBackground(new Color(0, 0, 0, 0));//设置背景透明setLayout(null);inquire = new JButton("查询全部单词");inquire.setFont(FontLoader.getCustomFont(15));inquire.setUI(new BEButtonUI().setNormalColor(BEButtonUI.NormalColor.green));inquire.setBounds(0, 0, 800, 50);add(inquire);showWord = new JTextArea();showWord.setFont(FontLoader.getCustomFont(15));JScrollPane scrollPane = new JScrollPane(showWord);scrollPane.setPreferredSize(new Dimension(800, 500));scrollPane.setBackground(new Color(0, 0, 0, 0));scrollPane.setBounds(0, 50, 746, 350);add(scrollPane);}private void registerListener() {handleQueryAllWord = new HandleQueryAllWord();handleQueryAllWord.setView(this);inquire.addActionListener(handleQueryAllWord);}
}

5.25 QueryOneWordView.java

package src.view;
import org.jb2011.lnf.beautyeye.ch3_button.BEButtonUI;
import src.resource.FontLoader;import javax.swing.*;
import java.awt.*;
public class QueryOneWordView extends JPanel {JTextField inputWord;   //输入要查询的单词JLabel inputWordLabel;  //输入单词标签JButton inquire;        //提交按钮JTextArea showWord;  //显示查询结果HandleQueryOneWord handleQueryOneWord; //负责处理查询单词QueryOneWordView(){initView();registerListener() ;}private void initView() {setBackground(new Color(0,0,0,0));//设置背景透明Box boxV = Box.createVerticalBox();//创建列式盒JPanel pNorth = new JPanel();//创建面板inputWord = new JTextField(12);//创建输入单词输入框inputWord.setFont(FontLoader.getCustomFont(15));//设置输入单词输入框字体inquire = new JButton("查询单词");inquire.setFont(FontLoader.getCustomFont(15));inquire.setUI(new BEButtonUI().setNormalColor(BEButtonUI.NormalColor.green));showWord = new JTextArea();showWord.setFont(FontLoader.getCustomFont(15));inputWordLabel = new JLabel("输入要查询的单词:");inputWordLabel.setFont(FontLoader.getCustomFont(15));pNorth.add(inputWordLabel);pNorth.add(Box.createHorizontalStrut(20));pNorth.add(inputWord);pNorth.add(Box.createHorizontalStrut(20));pNorth.add(inquire);boxV.add(pNorth);boxV.add(Box.createVerticalStrut(10));showWord.setEditable(false);JScrollPane scrollPane = new JScrollPane(showWord);scrollPane.setPreferredSize(new Dimension(400, 300));scrollPane.setBackground(new Color(0,0,0,0));boxV.add(scrollPane);add(boxV);}private void registerListener() {handleQueryOneWord = new HandleQueryOneWord();handleQueryOneWord.setView(this);inquire.addActionListener(handleQueryOneWord);}
}

5.26 RandomQueryView.java

package src.view;import src.resource.FontLoader;import java.awt.*;
import javax.swing.*;public class RandomQueryView extends JPanel {JTextField inputQueryNumber;//输入要查询的单词数目JLabel inputQueryNumberLabel;//输入单词数目标签JButton submit;            //查询按钮JTextArea showWord;       //显示查询结果HandleRandomQueryWord handleRandomQueryWord;  //负责处理随机查询单词RandomQueryView() {initView();registerListener();}public void initView() {setBackground(new Color(0, 0, 0, 0));//设置背景透明setLayout(null);JPanel pNorth = new JPanel();inputQueryNumberLabel = new JLabel("输入随机查询的数目:");inputQueryNumberLabel.setFont(FontLoader.getCustomFont(15));inputQueryNumber = new JTextField(4);inputQueryNumber.setFont(FontLoader.getCustomFont(15));showWord = new JTextArea();showWord.setFont(FontLoader.getCustomFont(15));submit = new JButton("查询");submit.setFont(FontLoader.getCustomFont(15));pNorth.setBounds(0, 0, 800, 50);pNorth.setBackground(new Color(0, 0, 0, 0));pNorth.add(inputQueryNumberLabel);pNorth.add(inputQueryNumber);pNorth.add(submit);JScrollPane scrollPane = new JScrollPane(showWord);scrollPane.setPreferredSize(new Dimension(800, 500));scrollPane.setBackground(new Color(0, 0, 0, 0));scrollPane.setBounds(0, 50, 746, 350);add(pNorth);add(scrollPane);}private void registerListener() {handleRandomQueryWord = new HandleRandomQueryWord();handleRandomQueryWord.setView(this);submit.addActionListener(handleRandomQueryWord);}
}

5.27 UpdateWordView.java

package src.view;import org.jb2011.lnf.beautyeye.ch3_button.BEButtonUI;
import src.resource.FontLoader;
import src.resource.RoundBorder;import javax.swing.*;//导入javax.swing包中的所有类
import javax.swing.plaf.BorderUIResource;
import java.awt.*;//导入java.awt包中的所有类public class UpdateWordView extends JPanel {JTextField inputWord;        //输入要更新的单词JTextField inputNewMeaning;  //输入单词的新解释JButton lookWord;            //提交查看JButton submit;              //提交更新按钮HandleUpdateWord handleUpdateWord;  //负责处理更新单词JLabel inputWordLabel, inputWordMeaningLabel, actionLabel;//输入单词标签,输入新的解释标签,提示信息标签JPanel contentPanel;//输入面板,提交面板UpdateWordView() {initView();registerListener();}private void initView() {/** 设置布局* 该界面分为左右两部分,左边是标签,右边是输入框和按钮*/setBackground(new Color(0, 0, 0, 0));//设置背景透明Box boxH, actionBox;                 //行式盒Box boxVOne, boxVTwo;      //列式盒boxH = Box.createHorizontalBox();actionBox = Box.createHorizontalBox();boxVOne = Box.createVerticalBox();boxVTwo = Box.createVerticalBox();boxH.setPreferredSize(new Dimension(400, 167));//设置行式盒大小boxVOne.setPreferredSize(new Dimension(100, 167));//设置列式盒大小boxVTwo.setPreferredSize(new Dimension(300, 167));//设置列式盒大小//初始化组件inputWord = new JTextField(30);inputWord.setFont(FontLoader.getCustomFont(15));inputNewMeaning = new JTextField(30);inputNewMeaning.setFont(FontLoader.getCustomFont(15));submit = new JButton("提交新的解释");submit.setFont(FontLoader.getCustomFont(20));submit.setForeground(Color.black);submit.setUI(new BEButtonUI().setNormalColor(BEButtonUI.NormalColor.lightBlue));lookWord = new JButton("查看原有解释");lookWord.setFont(FontLoader.getCustomFont(20));lookWord.setForeground(Color.black);lookWord.setUI(new BEButtonUI().setNormalColor(BEButtonUI.NormalColor.green));inputWordLabel = new JLabel("输入单词:");inputWordLabel.setFont(FontLoader.getCustomFont(20));actionLabel = new JLabel("选择操作:");actionLabel.setFont(FontLoader.getCustomFont(20));inputWordMeaningLabel = new JLabel("解       释:");inputWordMeaningLabel.setFont(FontLoader.getCustomFont(20));//往盒子里添加组件boxVOne.add(inputWordLabel);boxVOne.add(Box.createVerticalStrut(30));boxVOne.add(actionLabel);boxVOne.add(Box.createVerticalStrut(30));boxVOne.add(inputWordMeaningLabel);actionBox.add(lookWord);actionBox.add(Box.createHorizontalStrut(0));actionBox.add(submit);boxVTwo.add(Box.createVerticalStrut(0));boxVTwo.add(inputWord);boxVTwo.add(Box.createVerticalStrut(14));boxVTwo.add(actionBox);boxVTwo.add(Box.createVerticalStrut(14));boxVTwo.add(inputNewMeaning);boxH.add(boxVOne);boxH.add(Box.createHorizontalStrut(10));boxH.add(boxVTwo);//创建一个面板,设置边框contentPanel = new JPanel();contentPanel.setBackground(new Color(0, 0, 0, 0));contentPanel.setBorder(new RoundBorder(Color.black));contentPanel.add(boxH);add(contentPanel);}private void registerListener() {handleUpdateWord = new HandleUpdateWord();handleUpdateWord.setView(this);submit.addActionListener(handleUpdateWord);lookWord.addActionListener(handleUpdateWord);}
}

结语

如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!

【JAVA】穷词——基于嵌入式的数据库derby+BeautyEye的单词字典应用相关推荐

  1. Java实战项目-基于javaweb+mysql数据库实现的宠物领养|流浪猫狗网站

    <基于javaweb+mysql数据库实现的宠物领养网站>该项目含有源码.文档等资料.配套开发软件.软件安装教程.项目发布教程等 使用技术: 前端使用技术:JSP,HTML5,CSS3.J ...

  2. H2:一款基于 Java 的嵌入式关系型数据库

    文章目录 H2 简介 下载安装 执行 SQL 语句 查看帮助 运行 SQL 脚本 生成 DDL 语句 断开数据库连接 连接模式 命令行客户端 Maven 依赖 资源文档 总结 大家好,我是只谈技术不剪 ...

  3. linux上derby数据库,体验纯Java数据库——Derby

    Apache Derby是一个开源的.100% Java编写的.与平台无关的.易管理的关系数据库管理系统.Derby为用户提供了轻量的标准数据库引擎,它可以紧密的嵌入到任何基于Java的解决方案中.D ...

  4. Java 生态圈中的嵌入式数据库,哪家强?

    每天早上七点三十,准时推送干货 嵌入式数据库一个很陌生的词汇,以前只是听说,但是没有真正使用过,今天阿粉和大家一起来揭开它的面纱. 一.介绍 初次接触嵌入式数据库(Embedded Database) ...

  5. springboot嵌入式数据库derby初探

    Apache Derby 是100% Java 编写的内存数据库,属于 Apache 的一个开源项目.并且是一个容易管理的关系数据库管理系统 Apache Derby 是一个与平台无关的数据库引擎,它 ...

  6. java计算机毕业设计基于web的老年公寓管理源码+数据库+系统+lw文档+mybatis+运行部署

    java计算机毕业设计基于web的老年公寓管理源码+数据库+系统+lw文档+mybatis+运行部署 java计算机毕业设计基于web的老年公寓管理源码+数据库+系统+lw文档+mybatis+运行部 ...

  7. java计算机毕业设计基于ssm的协同过滤算法的电影推荐系统(源代码+数据库+Lw文档)

    项目介绍 "互联网+"的战略实施后,很多行业的信息化水平都有了很大的提升.但是目前很多行业的管理仍是通过人工管理的方式进行,需要在各个岗位投入大量的人力进行很多重复性工作,使得对人 ...

  8. 最新爱词霸 Java + mysql (含源码+数据库)

    爱词霸 最新爬取 Java + mysql (含源码+数据库) 感觉金山词库的内容相对来说是最完整的!研究了一天,通过爬取html整出来的! 当然只是教程,切勿真实爬取.具体实现为什么这么做,不做阐述 ...

  9. JAVA计算机毕业设计基于vue技术的汽车维修检测系统设计与实现源码+数据库+系统+lw文档

    JAVA计算机毕业设计基于vue技术的汽车维修检测系统设计与实现源码+数据库+系统+lw文档 JAVA计算机毕业设计基于vue技术的汽车维修检测系统设计与实现源码+数据库+系统+lw文档 本源码技术栈 ...

最新文章

  1. 建议被降级降薪员工主动辞职?网友炸了!
  2. 从零开始入门 K8s | Kubernetes 存储架构及插件使用
  3. Selenium实现将淘宝商品加入购物车
  4. Java调用百度OCR文字识别的接口
  5. java 正则提取大于等于号_Java正则表达式
  6. 动手为王:由一条UPDATE语句引发的一波三折深入实践(含PPT)
  7. war包热更新_基于IDEA热部署更新服务器Tomcat类,服务器Tomcat热更新
  8. SLF4J: Class path contains multiple SLF4J bindings.
  9. confirm的意思中文翻译_confirm的中文意思
  10. 荣耀青春30青春版能升鸿蒙,或是新一代拍照神器 荣耀30青春版今日发布
  11. 完美解决html中select的option不能隐藏的问题。
  12. Gradle之SourceSet
  13. 邮递员算法问题之c++实现
  14. 《实用C语言编程》读书笔记
  15. 计算机硬盘接口分类,硬盘接口几种常规的类型
  16. [变分法介绍]优美的旋轮线:最速下降线问题,通过费马光学原理的初等证明
  17. JAVA-读取excel转成html 将excel表格转换为HTML文件格式 转成前端表格样式
  18. IPEmotion数据处理-分类元件的灵活运用——车辆制动次数的多样计算
  19. python学习 -对象把微信消息撤回后好慌,有了这个你就能看到撤回的消息了(超详解)
  20. 韬韬抢苹果 #普及组#

热门文章

  1. 哈工大操作系统实验——实现proc文件系统
  2. 山东大学Linux应用实验五
  3. phantomjs入门使用
  4. php 获取月份第一天和最后一天,php 获取指定月第一天和最后一天
  5. Window入侵排查思路
  6. 证券投资基金会计核算准则学习
  7. Ubuntu16.04 安装指定版本docker ce
  8. ppt技巧一四步法调整PPT
  9. 高等数学 —— 函数的极限
  10. ACL 概述及工作原理