这个项目用了8个晚上(20:00-23:00)加上2个白天完成。

一、所用知识点

1、java语言基础

2、多线程

3、Swing控件

4、数据库技术(MySQL)

二、项目目标

1、通过登录窗体点击进入主窗体

2、查看号码的走向趋势

3、随机选号功能

4、显示进度条、统计标签中的数据

5、折线图显示号码趋势

6、选号有要求产生随机号码

三、Jar包介绍

每个项目都要使用一些已经成熟的技术,它们通常是由一些专业组织或团队所提供的开源免费技术。在今后的学习过程中,我们会逐渐对这些专业组织有所了解。本项目中使用的技术如下:

BackgroundImage.jar    //实现窗体背景面板的Jar包

forms -1.3.0.jar    //设计号码走向趋势折线图的Jar包

jcommom-1.0.16.jar    //设计号码走向趋势折线图的Jar包

jfreechart-1.0.13.jar    //设计号码走向趋势折线图的Jar包

linechartgraph.jar    //实现号码走向趋势图的Jar包

mrcpdao.jar    //操作开奖信息的Jar包

mysql-connector-java-5.1.10-bin.jar    //实现数据库连接的Jar包

四、代码实现

1、项目的登录窗体

package com.frame;import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;public class LoginMain extends JFrame {private JPanel contentPane;public static void main(String[] args) {try {//设置登录窗体风格UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAmdFeel");} catch (Throwable e) {e.printStackTrace();}EventQueue.invokeLater(new Runnable() {public void run() {try{//实例化登录窗口LoginMain frame = new LoginMain();//使登录窗体可见frame.setVisible(true);}catch(Exception e) {e.printStackTrace();}}});}public LoginMain() {  //登录窗体的构造方法setTitle("明日彩票预测系统");  //登录窗体的标题//登录窗体的标题图标setIconImage(Toolkit.getDefaultToolkit().getImage(LoginMain.class.getResource("/imgs/log.png")));setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  //对登录窗体发起‘close’时,推出应用程序setBounds(200,100,1100,620);  //登录窗体的位置及宽高contentPane = new JPanel();  //内容看板setContentPane(contentPane);  //把内容面板放入登录窗体中contentPane.setLayout(new BorderLayout(0,0));  //设置内容面板的布局为边界布局JButton btnNewButton = new JButton("");  //实例化无文本内容的按钮//设置按钮的图片btnNewButton.setIcon(new ImageIcon(LoginMain.class.getResource("/imgs/login1.jpg")));contentPane.add(btnNewButton, BorderLayout.CENTER);  //按钮放置在内容面板的中间btnNewButton.addActionListener(new ActionListener() {// 为按钮添加动作事件的监听public void actionPerformed(ActionEvent e) {// 动作事件的监听的方法体do_btnNewButton_actionPerformed(e);// 按钮触发动作事件的监听时执行的方法}});}// 按钮触发动作事件的监听时执行的方法protected void do_btnNewButton_actionPerformed(ActionEvent e) {this.setVisible(false);// 登录窗体不可见MainFrame t = new MainFrame();// 创建主窗体t.setVisible(true);// 使主窗体可见}}

2、项目的主窗体

package com.frame;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;import com.db.ConnMySQL;public class MainFrame extends JFrame {private JPanel jcontentPane;// 内容面板private JButton firstPageButton;// 首页private JButton latePageButton;// 尾页private JButton nextPageButton;// 下一页private JButton lastPageButton;// 上一页private JTable table;// 表格模型private int maxPageNumber;// 表格的总页数private int maxrows = 0;// 初始化最大行数为0private int currentPageNumber = 1;// 初始化表格的当前页数为1private double pageSize = 20;// 每页表格可容纳20条数据private DefaultTableModel defaultModel;// 表格模型的实例对象public static void main(String[] args) {try {// 设置主窗体风格UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");} catch (Throwable e) {e.printStackTrace();}EventQueue.invokeLater(new Runnable() {public void run() {try {// 实例化主窗体MainFrame frame = new MainFrame();frame.setVisible(true);// 使主窗体可见} catch (Exception e) {e.printStackTrace();}}});}public MainFrame() {// 主窗体的构造方法setForeground(Color.BLACK);// 设置前景色为黑色setTitle("明日彩票预测系统");// 主窗体的标题setResizable(false);// 主窗体不能改变大小// 主窗体的标题图标setIconImage(Toolkit.getDefaultToolkit().getImage(MainFrame.class.getResource("/imgs/log.png")));setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 对登录窗体发起“close”时,退出应用程序setBounds(200, 100, 1100, 600);// 登录窗体的位置及宽高jcontentPane = new JPanel();// 实例化内容面板jcontentPane.setLayout(new BorderLayout(0, 0));// 设置内容面板的布局为边界布局setContentPane(jcontentPane);// 把内容面板放入主窗体中BackgroundPanel contentPane = new BackgroundPanel();// 创建自定义背景面板// 设置背景面板的图片contentPane.setImage(getToolkit().getImage(getClass().getResource("/imgs/main.png")));jcontentPane.add(contentPane, BorderLayout.CENTER);// 添加背景面板到内容面板JButton btnNewButton = new JButton("");// “添加开奖号码”按钮// 设置“添加开奖号码”按钮的图标btnNewButton.setIcon(new ImageIcon(MainFrame.class.getResource("/img_btn/10.png")));btnNewButton.setBounds(6, 114, 184, 40);// “添加开奖号码”按钮的位置及宽高contentPane.add(btnNewButton);// 将“添加开奖号码”按钮添加到自定义背景面板中JButton button = new JButton("");// “查看历届开奖”按钮// 设置“查看历届开奖”按钮的图标button.setIcon(new ImageIcon(MainFrame.class.getResource("/img_btn/09.png")));button.setBounds(6, 74, 184, 40);// “查看历届开奖”按钮的位置及宽高contentPane.add(button);// 将“查看历届开奖”按钮添加到自定义背景面板中JButton button_1 = new JButton("");// “批量添加号码”按钮// 设置“批量添加号码”按钮的图标button_1.setIcon(new ImageIcon(MainFrame.class.getResource("/img_btn/11.png")));button_1.setBounds(6, 154, 184, 40);// “批量添加号码”按钮的位置及宽高contentPane.add(button_1);// 将“批量添加号码”按钮添加到自定义背景面板中JButton updatebutton = new JButton("");// “修改开奖号码”按钮// 设置“修改开奖号码”按钮的图标updatebutton.setIcon(new ImageIcon(MainFrame.class.getResource("/img_btn/12.png")));updatebutton.setBounds(6, 194, 184, 40);// “修改开奖号码”按钮的位置及宽高contentPane.add(updatebutton);// 将“修改开奖号码”按钮添加到自定义背景面板中JButton button_3 = new JButton("");// “查看号码走势”按钮// 设置“查看号码走势”按钮的图标button_3.setIcon(new ImageIcon(MainFrame.class.getResource("/img_btn/14.png")));button_3.setBounds(6, 234, 184, 40);// “查看号码走势”按钮的位置及宽高contentPane.add(button_3);// 将“查看号码走势”按钮添加到自定义背景面板中JButton button_4 = new JButton("");// “随机选号”按钮// 设置“随机选号”按钮的图标button_4.setIcon(new ImageIcon(MainFrame.class.getResource("/img_btn/15.png")));button_4.setBounds(6, 274, 184, 40);// “随机选号”按钮的位置及宽高contentPane.add(button_4);// 将“随机选号”按钮添加到自定义背景面板中JButton button_5 = new JButton("");// “中奖查询”按钮// 设置“中奖查询”按钮的图标button_5.setIcon(new ImageIcon(MainFrame.class.getResource("/img_btn/17.png")));button_5.setBounds(6, 314, 184, 40);// “中奖查询”按钮的位置及宽高contentPane.add(button_5);// 将“中奖查询”按钮添加到自定义背景面板中JButton button_6 = new JButton("");// “历史战绩”按钮// 设置“历史战绩”按钮的图标button_6.setIcon(new ImageIcon(MainFrame.class.getResource("/img_btn/18.png")));button_6.setBounds(6, 354, 184, 40);// “历史战绩”按钮的位置及宽高contentPane.add(button_6);// 将“历史战绩”按钮添加到自定义背景面板中JButton button_2 = new JButton("");// “退出系统”按钮// 设置“退出系统”按钮的图标button_2.setIcon(new ImageIcon(MainFrame.class.getResource("/img_btn/08.png")));button_2.setBounds(6, 394, 184, 40);// “退出系统”按钮的位置及宽高contentPane.add(button_2);// 将“退出系统”按钮添加到自定义背景面板中JScrollPane scrollPane = new JScrollPane(); // 滚动面板scrollPane.setBackground(new Color(0, 51, 204)); // 滚动面板背景色scrollPane.setBounds(217, 74, 848, 351); // 滚动面板在主窗体中的位置及宽高contentPane.add(scrollPane); // 将滚动面板添加到自定义背景面板中table = new JTable(); // 表格模型scrollPane.setViewportView(table); // 向滚动面板中添加表格firstPageButton = new JButton("首   页"); // “首页”按钮// 设置“首页”按钮的图标firstPageButton.setIcon(new ImageIcon(MainFrame.class.getResource("/img_btn/7_08.png")));firstPageButton.setBounds(416, 439, 84, 27); // “首页”按钮的位置及宽高contentPane.add(firstPageButton); // 将“首页”按钮添加到自定义背景面板中latePageButton = new JButton("上一页"); // “上一页”按钮// 设置“上一页”按钮的图标latePageButton.setIcon(new ImageIcon(MainFrame.class.getResource("/img_btn/7_10.png")));latePageButton.setBounds(550, 439, 84, 27); // “上一页”按钮的位置及宽高contentPane.add(latePageButton); // 将“上一页”按钮添加到自定义背景面板中nextPageButton = new JButton("下一页"); // “下一页”按钮// 设置“下一页”按钮的图标nextPageButton.setIcon(new ImageIcon(MainFrame.class.getResource("/img_btn/7_09.png")));nextPageButton.setBounds(686, 439, 84, 27); // “下一页”按钮的位置及宽高contentPane.add(nextPageButton); // 将“下一页”按钮添加到自定义背景面板中lastPageButton = new JButton("尾   页"); // “尾页”按钮// 设置“尾页”按钮的图标lastPageButton.setIcon(new ImageIcon(MainFrame.class.getResource("/img_btn/7_11.png")));lastPageButton.setBounds(819, 439, 84, 27); // “尾页”按钮的位置及宽高contentPane.add(lastPageButton); // 将“尾页”按钮添加到自定义背景面板中firstPageButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {do_firstPageButton_actionPerformed(e);// 为“首页”按钮添加动作事件的监听}});lastPageButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {do_lastPageButton_actionPerformed(e);// 为“尾页”按钮添加动作事件的监听}});latePageButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {do_latePageButton_actionPerformed(e);// 为“上一页”按钮添加动作事件的监听}});nextPageButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {do_nextPageButton_actionPerformed(e);// 为“下一页”按钮添加动作事件的监听}});button_3.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {do_button_3_actionPerformed(e);// 为“查看号码走势”按钮添加动作事件的监听}});button_4.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {do_button_4_actionPerformed(e);// 为“随机选号”按钮添加动作事件的监听}});selecttable();  //分页显示开奖号码的方法}// “随机选号”按钮添加动作事件的监听protected void do_button_4_actionPerformed(ActionEvent e) {ForecastAddframe forecastAddframe = new ForecastAddframe();// 随机选号对话框forecastAddframe.setVisible(true);// 使随机选号对话框可见}// “查看号码走势”按钮添加动作事件的监听protected void do_button_3_actionPerformed(ActionEvent e) {SparBuoy sparBuoy = new SparBuoy();// 号码走势对话框sparBuoy.setVisible(true);// 使号码走势对话框可见}// “上一页”按钮添加动作事件的监听protected void do_latePageButton_actionPerformed(ActionEvent e) {currentPageNumber--;// 将当前页面减一Vector dataVector = defaultModel.getDataVector();// 获得原表格模型中的数据DefaultTableModel newModel = new DefaultTableModel();// 创建新的表格模型// 定义表头newModel.setColumnIdentifiers(new Object[] { "期数", "第1位", "第2位", "第3位", "第4位", "第5位", "第6位", "第7位", "开奖时间" });for (int i = 0; i < pageSize; i++) {// 根据页面大小来获得数据newModel.addRow((Vector) dataVector.elementAt((int) (pageSize * (currentPageNumber - 1) + i)));}table.getTableHeader().setReorderingAllowed(false);table.setModel(newModel);// 设置表格模型if (currentPageNumber == 1) {firstPageButton.setEnabled(false);// 禁用“首页”按钮latePageButton.setEnabled(false);// 禁用“上一页”按钮}nextPageButton.setEnabled(true);// 启用“下一页”按钮lastPageButton.setEnabled(true);// 启用“尾页”按钮}// “下一页”按钮添加动作事件的监听protected void do_nextPageButton_actionPerformed(ActionEvent e) {currentPageNumber++;// 将当前页面加一Vector dataVector = defaultModel.getDataVector();// 获得原表格模型中的数据DefaultTableModel newModel = new DefaultTableModel();// 创建新的表格模型// 定义表头newModel.setColumnIdentifiers(new Object[] { "期数", "第1位", "第2位", "第3位", "第4位", "第5位", "第6位", "第7位", "开奖时间" });if (currentPageNumber == maxPageNumber) {int lastPageSize = (int)(defaultModel.getRowCount() - pageSize * (maxPageNumber - 1));for (int i = 0; i < lastPageSize; i++) {// 根据页面大小来获得数据newModel.addRow((Vector) dataVector.elementAt((int) (pageSize * (maxPageNumber - 1) + i)));}nextPageButton.setEnabled(false);// 禁用“下一页”按钮lastPageButton.setEnabled(false);// 禁用“尾页”按钮} else {for (int i = 0; i < pageSize; i++) {// 根据页面大小来获得数据newModel.addRow((Vector) dataVector.elementAt((int) (pageSize * (currentPageNumber - 1) + i)));}}table.getTableHeader().setReorderingAllowed(false);table.setModel(newModel);// 设置表格模型firstPageButton.setEnabled(true);// 启用“首页”按钮latePageButton.setEnabled(true);// 启用“上一页”按钮}// “首页”按钮添加动作事件的监听protected void do_firstPageButton_actionPerformed(ActionEvent e) {currentPageNumber = 1;// 将当前页码设置成1Vector dataVector = defaultModel.getDataVector();// 获得原表格模型中的数据DefaultTableModel newModel = new DefaultTableModel();// 创建新的表格模型// 定义表头newModel.setColumnIdentifiers(new Object[] { "期数", "第1位", "第2位", "第3位", "第4位", "第5位", "第6位", "第7位", "开奖时间" });for (int i = 0; i < pageSize; i++) {newModel.addRow((Vector) dataVector.elementAt(i));// 根据页面大小来获得数据}table.getTableHeader().setReorderingAllowed(false);table.setModel(newModel);// 设置表格模型firstPageButton.setEnabled(false);// 禁用“首页”按钮latePageButton.setEnabled(false);// 禁用“上一页”按钮nextPageButton.setEnabled(true);// 启用“下一页”按钮lastPageButton.setEnabled(true);// 启用“尾页”按钮}// “尾页”按钮添加动作事件的监听protected void do_lastPageButton_actionPerformed(ActionEvent e) {currentPageNumber = maxPageNumber;// 将当前页面设置为末页Vector dataVector = defaultModel.getDataVector();// 获得原表格模型中的数据DefaultTableModel newModel = new DefaultTableModel();// 创建新的表格模型// 定义表头newModel.setColumnIdentifiers(new Object[] { "期数", "第1位", "第2位", "第3位", "第4位", "第5位", "第6位", "第7位", "开奖时间" });int lastPageSize = (int) (defaultModel.getRowCount() - pageSize * (maxPageNumber - 1));if (lastPageSize == maxrows) {for (int i = 0; i < pageSize; i++) {// 根据页面大小来获得数据newModel.addRow((Vector) dataVector.elementAt((int) (pageSize * (maxPageNumber - 1) + i)));}} else {for (int i = 0; i < lastPageSize; i++) {// 根据页面大小来获得数据newModel.addRow((Vector) dataVector.elementAt((int) (pageSize * (maxPageNumber - 1) + i)));}}table.getTableHeader().setReorderingAllowed(false);table.setModel(newModel);// 设置表格模型firstPageButton.setEnabled(true);// 启用“首页”按钮latePageButton.setEnabled(true);// 启用“上一页”按钮nextPageButton.setEnabled(false);// 禁用“下一页”按钮lastPageButton.setEnabled(false);// 禁用“尾页”按钮}public void selecttable() {// 分页显示开奖号码的方法defaultModel = (DefaultTableModel) table.getModel();// 获得表格模型defaultModel.setRowCount(0);// 清空表格模型中的数据// 定义表头defaultModel.setColumnIdentifiers(new Object[] { "期数", "第1位", "第2位", "第3位", "第4位", "第5位", "第6位", "第7位", "开奖时间" });String sql = "select count(id) from tb_history";// 定义SQL语句ConnMySQL con = new ConnMySQL();// 连接数据库ResultSet rs = con.showAll(sql);// 执行SQL语句后获得的结果集try {if (rs.next())// 因为上面的执行结果是有且只有一个,所以我们用if语句来遍历集合{maxrows = rs.getInt(1);// 为最大行数赋值}con.closeConnection();// 关闭链接} catch (SQLException eq) {eq.printStackTrace();}if (maxrows != 0) {// 判断如果有数据执行下面的方法// 按照开奖期数降序排列获得表tb_history中数据的SQL语句sql = "select * from tb_history order by number desc";rs = con.showAll(sql);// 执行SQL语句后获得的结果集try {// 为表格中每一行的单元格赋值while (rs.next()) {defaultModel.addRow(new Object[] { rs.getInt(2), rs.getInt(3), rs.getInt(4), rs.getInt(5),rs.getInt(6), rs.getInt(7), rs.getInt(8), rs.getInt(9), rs.getString(10) });}} catch (SQLException e1) {e1.printStackTrace();}// 计算总页数maxPageNumber = (int) (maxrows % pageSize == 0 ? maxrows / pageSize : maxrows / pageSize + 1);DefaultTableModel newModel = new DefaultTableModel();// 创建新的表格模型// 定义表头newModel.setColumnIdentifiers(new Object[] { "期数", "第1位", "第2位", "第3位", "第4位", "第5位", "第6位", "第7位", "开奖时间" });for (int i = 0; i < pageSize; i++) {// 根据页面大小来获得数据newModel.addRow((Vector) defaultModel.getDataVector().elementAt(i));}table.getTableHeader().setReorderingAllowed(false);table.setModel(newModel);// 设置表格模型firstPageButton.setEnabled(false);// 禁用“首页”按钮latePageButton.setEnabled(false);// 禁用“上一页”按钮nextPageButton.setEnabled(true);// 启用“下一页”按钮lastPageButton.setEnabled(true);// 启用“尾页”按钮} else {firstPageButton.setEnabled(false);// 禁用“首页”按钮latePageButton.setEnabled(false);// 禁用“上一页”按钮nextPageButton.setEnabled(false);// 禁用“下一页”按钮lastPageButton.setEnabled(false);// 禁用“尾页”按钮}}
}

3、实现数据库的连接

package com.db;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.PreparedStatement;import java.util.ArrayList;
import java.util.List;import com.model.Forecast;
import com.model.History;public class ConnMySQL {private final String dbDriver = "com.mysql.jdbc.Driver";// 连接MySQL数据库的驱动// 连接MySQL数据库的路径private static final String URL = "jdbc:mysql://127.0.0.1:3306/db_lottery?useUnicode=true&characterEncoding=utf8";private static final String USERNAME = "root";// 连接MySQL数据库的用户名private static final String PASSWORD = "654321";// 连接MySQL数据库的密码private static Connection con = null;// 初始化连接MySQL数据库的对象public ConnMySQL() {// 连接MySQL数据库的构造方法try {Class.forName(dbDriver);// 加载MySQL数据库的驱动} catch (ClassNotFoundException e) {e.printStackTrace();System.out.println("数据库加载失败");}}public static boolean creatConnection() {// 建立MySQL数据库的连接try {// 根据连接MySQL数据库的路径、用户名、密码连接MySQL数据库con = (Connection) DriverManager.getConnection(URL, USERNAME, PASSWORD);} catch (SQLException e) {e.printStackTrace();}return true;}public void closeConnection() {// 关闭MySQL数据库的连接if (con != null) {// 判断Connection对象是否为空try {con.close();// 关闭MySQL数据库连接} catch (SQLException e) {e.printStackTrace();} finally {con = null;// 重置Connection对象为空}}}public ResultSet showAll(String sql) {// 显示所有开奖信息Statement statement = null;// 声明用于执行SQL语句的接口if (con == null) {// Connection对象为空creatConnection();// 建立MySQL数据库的连接}try {statement = con.createStatement();// 创建执行SQL语句的Statement对象ResultSet rs = statement.executeQuery(sql);// 执行查询语句获得结果集return rs;} catch (SQLException e) {e.printStackTrace();}return null;}public int getABC(String abc, int number) {// 获得进度条、统计标签中的数据// 获得number(0~9)在历届开奖号码中第abc(a~g)位出现的总次数String sql = "select count(" + abc + ") from tb_history where " + abc + "=" + number;Statement statement = null;// 声明用于执行SQL语句的接口int i = 0;// 初始化“开奖期数”if (con == null) {// Connection对象为空creatConnection();// 建立MySQL数据库的连接}try {statement = con.createStatement();// 创建执行SQL语句的Statement对象ResultSet rs = statement.executeQuery(sql);// 执行查询语句获得结果集while (rs.next()) {// 遍历结果集i = rs.getInt(1);// 获得“开奖期数”}} catch (SQLException e) {e.printStackTrace();} finally {closeStatement(statement);}return i;}public static void closeStatement(Statement stat) {// 关闭用于执行SQL语句的Statement对象if (stat != null) {try {stat.close();} catch (SQLException e) {System.err.println("关闭数据库语句异常");e.printStackTrace();}}}public static List<History> getFirstTenData() {// 获得最近10期的开奖结果// 获得最近10期开奖号码的SQL语句String sql = "SELECT * FROM tb_history ORDER BY number DESC LIMIT 10";List<History> list = new ArrayList<>();// 存储最近10期开奖结果的集合Statement statement = null;// 声明用于执行SQL语句的接口if (con == null) {// Connection对象为空creatConnection();// 建立MySQL数据库的连接}try {statement = con.createStatement();// 创建执行SQL语句的Statement对象ResultSet rs = statement.executeQuery(sql);// 执行查询语句获得结果集while (rs.next()) {// 遍历结果集History history = new History();// 创建历届开奖结果对象history.setNumber(rs.getInt(2));// 获得开奖期数history.setA(rs.getInt(3));// 获得第一位开奖号码history.setB(rs.getInt(4));// 获得第二位开奖号码history.setC(rs.getInt(5));// 获得第三位开奖号码history.setD(rs.getInt(6));// 获得第四位开奖号码history.setE(rs.getInt(7));// 获得第五位开奖号码history.setF(rs.getInt(8));// 获得第六位开奖号码history.setG(rs.getInt(9));// 获得第七位开奖号码list.add(history);// 向集合中添加开奖结果对象}} catch (SQLException e) {e.printStackTrace();} finally {closeStatement(statement);}return list;// 返回存储最近10期开奖结果的集合}public int selectNumber(String sql) {// 查询期数Statement statement = null;// 声明用于执行SQL语句的接口int i = 10001;// 初始化“开奖期数”if (con == null) {// Connection对象为空creatConnection();// 建立MySQL数据库的连接}try {statement = con.createStatement();ResultSet rs = statement.executeQuery(sql);while (rs.next()) {i = rs.getInt(1);// 替换“开奖期数”}} catch (SQLException e) {System.out.println("历史开奖号码添加失败!");e.printStackTrace();} finally {closeStatement(statement);}return i;}public Boolean addForecast(Forecast fr) {// 添加机选号码if (con == null) {// Connection对象为空creatConnection();// 建立MySQL数据库的连接}try {PreparedStatement statement = con.prepareStatement("insert into tb_forecast (number,a,b,c,d,e,f,g,forecasttime) "+ "values(?,?,?,?,?,?,?,?,?)"); // 定义插入数据库的预处理语句(括号里有9个“?”)statement.setInt(1, fr.getNumber()); // 设置预处理语句的参数值statement.setInt(2, fr.getA());statement.setInt(3, fr.getB());statement.setInt(4, fr.getC());statement.setInt(5, fr.getD());statement.setInt(6, fr.getE());statement.setInt(7, fr.getF());statement.setInt(8, fr.getG());statement.setString(9, fr.getForecasttime());statement.executeUpdate(); // 执行预处理语句return true;} catch (SQLException e) {System.out.println("机选号码添加失败!");e.printStackTrace();return false;}}
}

4、号码走势

package com.frame;import java.awt.Toolkit;import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;import com.allpanel.Apanel;public class SparBuoy extends JDialog {JTabbedPane tp = new JTabbedPane();// 创建选项卡面板public SparBuoy() {// 号码走势对话框的构造方法setTitle("号码走势");// 设置号码走势对话框的标题setResizable(false);// 不可改变号码走势对话框的大小// 设置号码走势对话框的窗体图标setIconImage(Toolkit.getDefaultToolkit().getImage(SparBuoy.class.getResource("/imgs/log.png")));tp.add("第一位", new Apanel());// 把第一位开奖号码的走势面板添加到选项卡面板中this.getContentPane().add(tp);// 把选项卡面板添加到号码走势对话框的内容面板中this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);// 这是号码走势对话框的关闭方式this.setBounds(450, 100, 563, 593);// 设置号码走势对话框的位置和宽高}public static void main(String[] args) {try {// 设置号码走势对话框的样式UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");} catch (Throwable e) {e.printStackTrace();}new SparBuoy();// 创建号码走势对话框对象}}

5、折线图的方式显示10期开奖号码趋势

package com.model;public class Forecast {private int id;// id(数据库中的id)private int number;// 开奖期数private int a;// 第1位private int b;// 第2位private int c;// 第3位private int d;// 第4位private int e;// 第5位private int f;// 第6位private int g;// 第7位private String forecasttime;// 预测时间private Long neutron;// 奖金public int getId() {return id;}public void setId(int id) {this.id = id;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public int getA() {return a;}public void setA(int a) {this.a = a;}public int getB() {return b;}public void setB(int b) {this.b = b;}public int getC() {return c;}public void setC(int c) {this.c = c;}public int getD() {return d;}public void setD(int d) {this.d = d;}public int getE() {return e;}public void setE(int e) {this.e = e;}public int getF() {return f;}public void setF(int f) {this.f = f;}public int getG() {return g;}public void setG(int g) {this.g = g;}public String getForecasttime() {return forecasttime;}public void setForecasttime(String forecasttime) {this.forecasttime = forecasttime;}public Long getNeutron() {return neutron;}public void setNeutron(Long neutron) {this.neutron = neutron;}}
package com.model;public class History {private int id;// id(数据库中的id)private int number;// 开奖期数private int a;// 第1位private int b;// 第2位private int c;// 第3位private int d;// 第4位private int e;// 第5位private int f;// 第6位private int g;// 第7位private String historytime;// 开奖时间public int getId() {return id;}public void setId(int id) {this.id = id;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public int getA() {return a;}public void setA(int a) {this.a = a;}public int getB() {return b;}public void setB(int b) {this.b = b;}public int getC() {return c;}public void setC(int c) {this.c = c;}public int getD() {return d;}public void setD(int d) {this.d = d;}public int getE() {return e;}public void setE(int e) {this.e = e;}public int getF() {return f;}public void setF(int f) {this.f = f;}public int getG() {return g;}public void setG(int g) {this.g = g;}public String getHistorytime() {return historytime;}public void setHistorytime(String historytime) {this.historytime = historytime;}}

6、随机选号

package com.frame;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.SwingConstants;import com.dao.ForecastDao;
import com.dao.HistoryDao;
import com.dao.LotteryValidate;public class ForecastAddframe extends JDialog implements Runnable, ActionListener {// 随机选号对话框private JPanel jpl;// 内容面板JButton bt1 = new JButton();// 显示随机选号第1位的按钮JButton bt2 = new JButton();// 显示随机选号第2位的按钮JButton bt3 = new JButton();// 显示随机选号第3位的按钮JButton bt4 = new JButton();// 显示随机选号第4位的按钮JButton bt5 = new JButton();// 显示随机选号第5位的按钮JButton bt6 = new JButton();// 显示随机选号第6位的按钮JButton bt7 = new JButton();// 显示随机选号第7位的按钮JButton but = new JButton("");// “机选一注”按钮private final JTextField sevenTextField = new JTextField();// “选号号码”文本框private final JLabel label = new JLabel("第");// “第”标签private final JLabel label_1 = new JLabel("期");// “期”标签private final JTextField numberTextField = new JTextField();// “开奖期数”文本框private final JButton btnNewButton = new JButton("");// “购买”按钮private final JButton btnNewButton_1 = new JButton("");// “关闭”按钮private final JLabel noteLabel = new JLabel("");// “提示”标签// 复选框0~9private final JCheckBox ckBox_1 = new JCheckBox("1");private final JCheckBox ckBox_2 = new JCheckBox("2");private final JCheckBox ckBox_3 = new JCheckBox("3");private final JCheckBox ckBox_4 = new JCheckBox("4");private final JCheckBox ckBox_5 = new JCheckBox("5");private final JCheckBox ckBox_6 = new JCheckBox("6");private final JCheckBox ckBox_7 = new JCheckBox("7");private final JCheckBox ckBox_8 = new JCheckBox("8");private final JCheckBox ckBox_9 = new JCheckBox("9");private final JCheckBox ckBox_0 = new JCheckBox("0");private final JLabel lblTitle_1 = new JLabel("号码");// “号码”标签private final JLabel lblSameNum_1 = new JLabel("同号的个数");// “同号的个数”标签private final JLabel lblTitle_2 = new JLabel("号码");// “号码”标签private final JLabel lblSameNum_2 = new JLabel("同号的个数");// “同号的个数”标签// 与0~9复选框对应的文本框private JTextField tf_1;private JTextField tf_2;private JTextField tf_3;private JTextField tf_4;private JTextField tf_5;private JTextField tf_6;private JTextField tf_7;private JTextField tf_8;private JTextField tf_9;private JTextField tf_0;private JRadioButton rdbtnHave;// 单选按钮“有”private JRadioButton rabtnNone;// 单选按钮“无”boolean bol = true;// 控制选号时滚动效果的开启(true)与终止(false)int index = 0;// 初始化奖号变换时间int i = 0;// 初始化奖号int a;// 随机选号第1位的数字int b;// 随机选号第2位的数字int c;// 随机选号第3位的数字int d;// 随机选号第4位的数字int e;// 随机选号第5位的数字int f;// 随机选号第6位的数字int g;// 随机选号第7位的数字public ForecastAddframe() {// 随机选号对话框的构造方法setModal(true);// 使随机选号对话框总在最前setTitle("随机选号");// 设置随机选号对话框的标题// 设置随机选号对话框的标题图标setIconImage(Toolkit.getDefaultToolkit().getImage(ForecastAddframe.class.getResource("/imgs/log.png")));setResizable(false);// 随机选号对话框不可改变大小HistoryDao his = new HistoryDao();// 实例化操作开奖信息numberTextField.setText(his.selectNumber() + "");// 设置“开奖期数”文本框中的内容numberTextField.setEditable(false);// 设置“开奖期数”文本框不可编辑numberTextField.setBounds(331, 88, 64, 24);// 设置“开奖期数”文本框的位置和宽高numberTextField.setColumns(10);// 设置“开奖期数”文本框的宽度sevenTextField.setBounds(327, 410, 170, 27);// 设置“选号号码”文本框的位置和宽高sevenTextField.setColumns(10);// 设置“选号号码”文本框的宽度jpl = new JPanel();// 内容面板jpl.setLayout(new BorderLayout(0, 0));// 设置内容面板的布局为边界布局setContentPane(jpl);// 把内容面板置于随机选号对话框中BackgroundPanel pl = new BackgroundPanel();// 自定义背景面板pl.setImage(getToolkit().getImage(getClass().getResource("/imgs/001.png")));// 设置背景面板的图片jpl.add(pl, BorderLayout.CENTER);// 添加背景面板到内容面板// 设置“机选一注”按钮的图标but.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/img_btn/111.png")));but.setBounds(240, 410, 62, 28);// 设置“机选一注”按钮的位置以及宽高pl.add(but);// 把“机选一注”按钮置于自定义背景面板中but.addActionListener(this);// 为“机选一注”按钮添加动作事件的监听this.getContentPane().add(pl);// 将随机选号对话框中的控件置于自定义背景面板中/** 设置显示随机选号第1位~第7位的按钮的位置以及宽高, 并把显示随机选号第1位~第7位的按钮置于自定义背景面板中*/bt1.setBounds(74, 128, 84, 63);pl.add(bt1);bt2.setBounds(159, 128, 84, 63);pl.add(bt2);bt3.setBounds(244, 128, 84, 63);pl.add(bt3);bt4.setBounds(329, 128, 84, 63);pl.add(bt4);bt5.setBounds(414, 128, 84, 63);pl.add(bt5);bt6.setBounds(499, 128, 84, 63);pl.add(bt6);bt7.setBounds(584, 128, 84, 63);pl.add(bt7);pl.add(sevenTextField);// 把“选号号码”文本框置于自定义背景面板中pl.add(numberTextField);// 把“开奖期数”文本框置于自定义背景面板中label.setBounds(299, 90, 22, 18);// 设置“第”标签的位置以及宽高pl.add(label);// 把“第”标签置于自定义背景面板中label_1.setBounds(415, 90, 22, 18);// 设置“期”标签的位置以及宽高pl.add(label_1);// 把“期”标签置于自定义背景面板中// 设置“购买”按钮的图标btnNewButton.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/img_btn/a02.png")));btnNewButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {do_btnNewButton_actionPerformed(e);// 为“购买”按钮添加动作事件的监听}});btnNewButton.setBounds(239, 451, 109, 74);// 设置“购买”按钮的位置和宽高pl.add(btnNewButton);// 把“购买”按钮置于自定义背景面板中// 设置“关闭”按钮的图标btnNewButton_1.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/img_btn/a07.png")));btnNewButton_1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {do_btnNewButton_1_actionPerformed(e);// 为“关闭”按钮添加动作事件的监听}});btnNewButton_1.setBounds(389, 451, 108, 79);// 设置“关闭”按钮的位置和宽高pl.add(btnNewButton_1);// 把“关闭”按钮置于自定义背景面板中noteLabel.setBounds(507, 413, 202, 20);// 设置“提示”标签的位置和宽高noteLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14));// 设置“提示”标签内字体的样式和大小noteLabel.setForeground(Color.RED);// 设置“提示”标签内字体的颜色pl.add(noteLabel);// 把“提示”标签添加到背景面板中// “机选要求:”标签JLabel label_2 = new JLabel("机选要求:");label_2.setBounds(280, 214, 62, 15);pl.add(label_2);// 单选按钮“有”rdbtnHave = new JRadioButton("有");rdbtnHave.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {do_rdbtnHave_actionPerformed(e);// 单选按钮“有”动作事件的监听}});rdbtnHave.setBounds(350, 210, 40, 23);pl.add(rdbtnHave);// 单选按钮“无”rabtnNone = new JRadioButton("无");rabtnNone.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {do_rabtnNone_actionPerformed(e);// 单选按钮“无”动作事件的监听}});rabtnNone.setSelected(true);rabtnNone.setBounds(415, 210, 40, 23);pl.add(rabtnNone);// 按钮组ButtonGroup group = new ButtonGroup();group.add(rdbtnHave);group.add(rabtnNone);// 复选框“1”ckBox_1.setEnabled(false);ckBox_1.setBounds(240, 269, 38, 23);pl.add(ckBox_1);// 复选框“2”ckBox_2.setEnabled(false);ckBox_2.setBounds(240, 295, 38, 23);pl.add(ckBox_2);// 复选框“3”ckBox_3.setEnabled(false);ckBox_3.setBounds(240, 321, 38, 23);pl.add(ckBox_3);// 复选框“4”ckBox_4.setEnabled(false);ckBox_4.setBounds(240, 347, 38, 23);pl.add(ckBox_4);// 复选框“5”ckBox_5.setEnabled(false);ckBox_5.setBounds(240, 373, 38, 23);pl.add(ckBox_5);// 复选框“6”ckBox_6.setEnabled(false);ckBox_6.setBounds(381, 269, 38, 23);pl.add(ckBox_6);// 复选框“7”ckBox_7.setEnabled(false);ckBox_7.setBounds(381, 295, 38, 23);pl.add(ckBox_7);// 复选框“8”ckBox_8.setEnabled(false);ckBox_8.setBounds(381, 321, 38, 23);pl.add(ckBox_8);// 复选框“9”ckBox_9.setEnabled(false);ckBox_9.setBounds(381, 347, 38, 23);pl.add(ckBox_9);// 复选框“0”ckBox_0.setEnabled(false);ckBox_0.setBounds(381, 373, 38, 23);pl.add(ckBox_0);// 与复选框“1”对应的文本框tf_1 = new JTextField();tf_1.setEnabled(false);tf_1.setBounds(290, 270, 66, 21);pl.add(tf_1);tf_1.setColumns(10);// 与复选框“2”对应的文本框tf_2 = new JTextField();tf_2.setEnabled(false);tf_2.setBounds(290, 296, 66, 21);pl.add(tf_2);tf_2.setColumns(10);// 与复选框“3”对应的文本框tf_3 = new JTextField();tf_3.setEnabled(false);tf_3.setBounds(290, 322, 66, 21);pl.add(tf_3);tf_3.setColumns(10);// 与复选框“4”对应的文本框tf_4 = new JTextField();tf_4.setEnabled(false);tf_4.setBounds(290, 348, 66, 21);pl.add(tf_4);tf_4.setColumns(10);// 与复选框“5”对应的文本框tf_5 = new JTextField();tf_5.setEnabled(false);tf_5.setBounds(290, 374, 66, 21);pl.add(tf_5);tf_5.setColumns(10);// 与复选框“6”对应的文本框tf_6 = new JTextField();tf_6.setEnabled(false);tf_6.setBounds(431, 270, 66, 21);pl.add(tf_6);tf_6.setColumns(10);// 与复选框“7”对应的文本框tf_7 = new JTextField();tf_7.setEnabled(false);tf_7.setBounds(431, 296, 66, 21);pl.add(tf_7);tf_7.setColumns(10);// 与复选框“8”对应的文本框tf_8 = new JTextField();tf_8.setEnabled(false);tf_8.setBounds(431, 322, 66, 21);pl.add(tf_8);tf_8.setColumns(10);// 与复选框“9”对应的文本框tf_9 = new JTextField();tf_9.setEnabled(false);tf_9.setBounds(431, 348, 66, 21);pl.add(tf_9);tf_9.setColumns(10);// 与复选框“0”对应的文本框tf_0 = new JTextField();tf_0.setEnabled(false);tf_0.setBounds(431, 374, 66, 21);pl.add(tf_0);tf_0.setColumns(10);// “号码”标签lblTitle_1.setHorizontalAlignment(SwingConstants.CENTER);lblTitle_1.setBounds(240, 249, 38, 15);pl.add(lblTitle_1);// “同号的个数”标签lblSameNum_1.setHorizontalAlignment(SwingConstants.CENTER);lblSameNum_1.setBounds(290, 249, 66, 15);pl.add(lblSameNum_1);// “号码”标签lblTitle_2.setHorizontalAlignment(SwingConstants.CENTER);lblTitle_2.setBounds(381, 249, 38, 15);pl.add(lblTitle_2);// “同号的个数”标签lblSameNum_2.setHorizontalAlignment(SwingConstants.CENTER);lblSameNum_2.setBounds(431, 249, 66, 15);pl.add(lblSameNum_2);this.setBounds(350, 100, 753, 626);// 随机选号对话框的位置和宽高}// 单选按钮“无”动作事件的监听protected void do_rabtnNone_actionPerformed(ActionEvent e) {// 复选框没被选中ckBox_1.setSelected(false);ckBox_2.setSelected(false);ckBox_3.setSelected(false);ckBox_4.setSelected(false);ckBox_5.setSelected(false);ckBox_6.setSelected(false);ckBox_7.setSelected(false);ckBox_8.setSelected(false);ckBox_9.setSelected(false);ckBox_0.setSelected(false);// 禁用复选框ckBox_1.setEnabled(false);ckBox_2.setEnabled(false);ckBox_3.setEnabled(false);ckBox_4.setEnabled(false);ckBox_5.setEnabled(false);ckBox_6.setEnabled(false);ckBox_7.setEnabled(false);ckBox_8.setEnabled(false);ckBox_9.setEnabled(false);ckBox_0.setEnabled(false);// 清空文本框中的内容tf_1.setText("");tf_2.setText("");tf_3.setText("");tf_4.setText("");tf_5.setText("");tf_6.setText("");tf_7.setText("");tf_8.setText("");tf_9.setText("");tf_0.setText("");// 禁用文本框tf_1.setEnabled(false);tf_2.setEnabled(false);tf_3.setEnabled(false);tf_4.setEnabled(false);tf_5.setEnabled(false);tf_6.setEnabled(false);tf_7.setEnabled(false);tf_8.setEnabled(false);tf_9.setEnabled(false);tf_0.setEnabled(false);}// 单选按钮“有”动作事件的监听protected void do_rdbtnHave_actionPerformed(ActionEvent e) {// 启用复选框ckBox_1.setEnabled(true);ckBox_2.setEnabled(true);ckBox_3.setEnabled(true);ckBox_4.setEnabled(true);ckBox_5.setEnabled(true);ckBox_6.setEnabled(true);ckBox_7.setEnabled(true);ckBox_8.setEnabled(true);ckBox_9.setEnabled(true);ckBox_0.setEnabled(true);// 复选框的选项事件itemEvent(ckBox_1, tf_1);itemEvent(ckBox_2, tf_2);itemEvent(ckBox_3, tf_3);itemEvent(ckBox_4, tf_4);itemEvent(ckBox_5, tf_5);itemEvent(ckBox_6, tf_6);itemEvent(ckBox_7, tf_7);itemEvent(ckBox_8, tf_8);itemEvent(ckBox_9, tf_9);itemEvent(ckBox_0, tf_0);}@Overridepublic void run() {// 单选按钮“有”被选中且文本框为空时      if (rdbtnHave.isSelected() && tf_1.getText().equals("") && tf_2.getText().equals("")&& tf_3.getText().equals("") && tf_4.getText().equals("") && tf_5.getText().equals("")&& tf_6.getText().equals("") && tf_7.getText().equals("") && tf_8.getText().equals("")&& tf_9.getText().equals("") && tf_0.getText().equals("")) {JOptionPane.showMessageDialog(null, "警告:文本框不能为空!", "警告", JOptionPane.WARNING_MESSAGE);// 弹出提示框but.setEnabled(true);// 设置“机选一注”按钮可用return;}// 单选按钮“有”被选中且文本框中的数组之和大于7      if (rdbtnHave.isSelected() && (exchangeInteger(tf_1) + exchangeInteger(tf_2)+ exchangeInteger(tf_3) + exchangeInteger(tf_4) + exchangeInteger(tf_5) + exchangeInteger(tf_6) + exchangeInteger(tf_7) + exchangeInteger(tf_8) + exchangeInteger(tf_9) + exchangeInteger(tf_0)) > 7) {JOptionPane.showMessageDialog(null, "警告:号码个数多于7个!", "警告", JOptionPane.WARNING_MESSAGE);// 弹出提示框but.setEnabled(true);// 设置“机选一注”按钮可用return;}String s = "";// 存储随机生成的选号Random ram = new Random();// 随机数对象if (rabtnNone.isSelected()) {// 单选按钮“无”被选中while (bol) {try {if (i >= 10) {// i表示奖号,所以i不能大于10i = 0;}if (index < (500 - ram.nextInt(20))) {// 控制停止时间500毫秒减去20以内的随机数a = i;// 获得随机选号第1位的数字bt1.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/imgs/" + i + ".png")));// 通过循环变换图片以达到随机选号第1位的摇奖结果}if (index < (1000 - ram.nextInt(20))) {// 控制停止时间1000毫秒减去20以内的随机数b = i;// 获得随机选号第2位的数字bt2.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/imgs/" + i + ".png")));// 通过循环变换图片以达到随机选号第2位的摇奖结果}if (index < (1500 - ram.nextInt(20))) {// 控制停止时间1500毫秒减去20以内的随机数c = i;// 获得随机选号第3位的数字bt3.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/imgs/" + i + ".png")));// 通过循环变换图片以达到随机选号第3位的摇奖结果}if (index < (2000 - ram.nextInt(20))) {// 控制停止时间2000毫秒减去20以内的随机数d = i;// 获得随机选号第4位的数字bt4.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/imgs/" + i + ".png")));// 通过循环变换图片以达到随机选号第4位的摇奖结果}if (index < (3000 - ram.nextInt(20))) {// 控制停止时间3000毫秒减去20以内的随机数e = i;// 获得随机选号第5位的数字bt5.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/imgs/" + i + ".png")));// 通过循环变换图片以达到随机选号第5位的摇奖结果}if (index < (4000 - ram.nextInt(20))) {// 控制停止时间4000毫秒减去20以内的随机数f = i;// 获得随机选号第6位的数字bt6.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/imgs/" + i + ".png")));// 通过循环变换图片以达到随机选号第6位的摇奖结果}if (index < (5000 - ram.nextInt(20))) {// 控制停止时间5000毫秒减去20以内的随机数g = i;// 获得随机选号第7位的数字bt7.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/imgs/" + i + ".png")));// 通过循环变换图片以达到随机选号第7位的摇奖结果}switch (index) {// 以奖号变换时间为参数的多分支语句case 500:// 500毫秒时s = sevenTextField.getText();// 获取“选号号码”文本框中的空内容sevenTextField.setText(s + a);// 把第1位的值添加到“选号号码”文本框中break;case 1000:// 1000毫秒时s = sevenTextField.getText();// 获取“选号号码”文本框中的第1位奖号sevenTextField.setText(s + b);// 把第2位的值添加到“选号号码”文本框中break;case 1500:// 1500毫秒时s = sevenTextField.getText();// 获取“选号号码”文本框中的前2位奖号sevenTextField.setText(s + c);// 把第3位的值添加到“选号号码”文本框中break;case 2000:// 2000毫秒时s = sevenTextField.getText();// 获取“选号号码”文本框中的前3位奖号sevenTextField.setText(s + d);// 把第4位的值添加到“选号号码”文本框中break;case 3000:// 3000毫秒时s = sevenTextField.getText();// 获取“选号号码”文本框中的前4位奖号sevenTextField.setText(s + e);// 把第5位的值添加到“选号号码”文本框中break;case 4000:// 4000毫秒时s = sevenTextField.getText();// 获取“选号号码”文本框中的前5位奖号sevenTextField.setText(s + f);// 把第6位的值添加到“选号号码”文本框中break;case 5000:// 5000毫秒时s = sevenTextField.getText();// 获取“选号号码”文本框中的前6位奖号sevenTextField.setText(s + g);// 把第7位的值添加到“选号号码”文本框中bol = false;//but.setEnabled(true);// 设置“机选一注”按钮可用break;}i++;// i = i + 1Thread.sleep(0);// 线程不休眠index++;// index = index + 1} catch (InterruptedException e) {e.printStackTrace();}}}if (rdbtnHave.isSelected()) {// 单选按钮“有”被选中List<Integer> list = new ArrayList<>();// “号码”集合String[] str = new String[10];// 存储复选框与文本框中文本内容的数组// 填充数组str[0] = itemEvent(ckBox_1, tf_1);str[1] = itemEvent(ckBox_2, tf_2);str[2] = itemEvent(ckBox_3, tf_3);str[3] = itemEvent(ckBox_4, tf_4);str[4] = itemEvent(ckBox_5, tf_5);str[5] = itemEvent(ckBox_6, tf_6);str[6] = itemEvent(ckBox_7, tf_7);str[7] = itemEvent(ckBox_8, tf_8);str[8] = itemEvent(ckBox_9, tf_9);str[9] = itemEvent(ckBox_0, tf_0);// 遍历数组for (int i = 0; i < str.length; i++) {String[] text = str[i].split(":");// 拆分数组中的元素if (text.length == 2) {int number = Integer.parseInt(text[0]);// 号码int quantity = Integer.parseInt(text[1]);// 同号的个数// 向集合list中添加元素if (quantity > 1) {for (int j = 0; j < quantity; j++) {list.add(number);}} else {list.add(number);}}}// 集合中的元素个数小于7while (list.size() < 7) {int num = ram.nextInt(10);// 随机生成一个在0~9范围内的整数if (list.contains(num)) {// 集合中包含随机生成一个在0~9范围内的整数continue;// 跳过本次循环,执行下一次循环} else {// 集合中不包含随机生成一个在0~9范围内的整数list.add(num);// 向集合list中添加元素}}List<Integer> indexes = new ArrayList<>();// “号码”集合中元素索引的集合// 集合中的元素个数小于7while (indexes.size() < 7) {int index = ram.nextInt(7);// 随机生成一个在0~6范围内的整数if (indexes.contains(index)) {// 集合中包含随机生成一个在0~6范围内的整数continue;// 跳过本次循环,执行下一次循环} else {// 集合中不包含随机生成一个在0~6范围内的整数indexes.add(index);// 向集合indexes中添加元素}}while (bol) {try {if (index < (500 - ram.nextInt(20))) {// 控制停止时间500毫秒减去20以内的随机数a = list.get(indexes.get(0));// 获得随机选号第1位的数字bt1.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/imgs/" + a + ".png")));// 通过循环变换图片以达到随机选号第1位的摇奖结果}if (index < (1000 - ram.nextInt(20))) {// 控制停止时间1000毫秒减去20以内的随机数b = list.get(indexes.get(1));// 获得随机选号第2位的数字bt2.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/imgs/" + b + ".png")));// 通过循环变换图片以达到随机选号第2位的摇奖结果}if (index < (1500 - ram.nextInt(20))) {// 控制停止时间1500毫秒减去20以内的随机数c = list.get(indexes.get(2));// 获得随机选号第3位的数字bt3.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/imgs/" + c + ".png")));// 通过循环变换图片以达到随机选号第3位的摇奖结果}if (index < (2000 - ram.nextInt(20))) {// 控制停止时间2000毫秒减去20以内的随机数d = list.get(indexes.get(3));// 获得随机选号第4位的数字bt4.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/imgs/" + d + ".png")));// 通过循环变换图片以达到随机选号第4位的摇奖结果}if (index < (3000 - ram.nextInt(20))) {// 控制停止时间3000毫秒减去20以内的随机数e = list.get(indexes.get(4));// 获得随机选号第5位的数字bt5.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/imgs/" + e + ".png")));// 通过循环变换图片以达到随机选号第5位的摇奖结果}if (index < (4000 - ram.nextInt(20))) {// 控制停止时间4000毫秒减去20以内的随机数f = list.get(indexes.get(5));// 获得随机选号第6位的数字bt6.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/imgs/" + f + ".png")));// 通过循环变换图片以达到随机选号第6位的摇奖结果}if (index < (5000 - ram.nextInt(20))) {// 控制停止时间5000毫秒减去20以内的随机数g = list.get(indexes.get(6));// 获得随机选号第7位的数字bt7.setIcon(new ImageIcon(ForecastAddframe.class.getResource("/imgs/" + g + ".png")));// 通过循环变换图片以达到随机选号第7位的摇奖结果}switch (index) {// 以奖号变换时间为参数的多分支语句case 500:// 500毫秒时s = sevenTextField.getText();// 获取“选号号码”文本框中的空内容sevenTextField.setText(s + a);// 把第1位的值添加到“选号号码”文本框中break;case 1000:// 1000毫秒时s = sevenTextField.getText();// 获取“选号号码”文本框中的第1位奖号sevenTextField.setText(s + b);// 把第2位的值添加到“选号号码”文本框中break;case 1500:// 1500毫秒时s = sevenTextField.getText();// 获取“选号号码”文本框中的前2位奖号sevenTextField.setText(s + c);// 把第3位的值添加到“选号号码”文本框中break;case 2000:// 2000毫秒时s = sevenTextField.getText();// 获取“选号号码”文本框中的前3位奖号sevenTextField.setText(s + d);// 把第4位的值添加到“选号号码”文本框中break;case 3000:// 3000毫秒时s = sevenTextField.getText();// 获取“选号号码”文本框中的前4位奖号sevenTextField.setText(s + e);// 把第5位的值添加到“选号号码”文本框中break;case 4000:// 4000毫秒时s = sevenTextField.getText();// 获取“选号号码”文本框中的前5位奖号sevenTextField.setText(s + f);// 把第6位的值添加到“选号号码”文本框中break;case 5000:// 5000毫秒时s = sevenTextField.getText();// 获取“选号号码”文本框中的前6位奖号sevenTextField.setText(s + g);// 把第7位的值添加到“选号号码”文本框中bol = false;//but.setEnabled(true);// 设置“机选一注”按钮可用break;}i++;// i = i + 1Thread.sleep(0);// 线程不休眠index++;// index = index + 1} catch (InterruptedException e) {e.printStackTrace();}}}}@Overridepublic void actionPerformed(ActionEvent e) {noteLabel.setText("");// 设置“提示”标签内容为空bt1.setText("");// 设置显示随机选号第1位的按钮内容为空bt2.setText("");// 设置显示随机选号第2位的按钮内容为空bt3.setText("");// 设置显示随机选号第3位的按钮内容为空bt4.setText("");// 设置显示随机选号第4位的按钮内容为空bt5.setText("");// 设置显示随机选号第5位的按钮内容为空bt6.setText("");// 设置显示随机选号第6位的按钮内容为空bt7.setText("");// 设置显示随机选号第7位的按钮内容为空sevenTextField.setText("");// 设置“选号号码”文本框内容为空bol = true;index = 0;// 为奖号变换时间赋值but.setEnabled(false);// 设置“机选一注”按钮不可用Thread th1 = new Thread(this);// 在随机选号对话框中创建线程th1.start();// 启动线程}// “购买”添加动作事件的监听protected void do_btnNewButton_actionPerformed(ActionEvent e) {LotteryValidate validate = new LotteryValidate();// 实例化验证信息// “选号号码”本框输入的“选号号码”的格式错误if (!validate.validateNumber(sevenTextField.getText())) {noteLabel.setText("购买号码格式不正确");// 设置“提示”标签内容}// “选号号码”本框输入的“选号号码”的格式正确if (validate.validateNumber(sevenTextField.getText())) {noteLabel.setText("");// 设置“提示”标签内容为空ForecastDao fr = new ForecastDao();// 实例化操作购买彩票记录信息Boolean b;b = fr.addForecastDao(Integer.parseInt(numberTextField.getText()), sevenTextField.getText());// 获得添加购买号码的返回值if (b) {// 添加购买号码成功noteLabel.setText("购买成功!");// 设置“购买状态”标签内容HistoryDao his = new HistoryDao();// 实例化操作开奖信息numberTextField.setText(his.selectNumber() + "");// 设置“开奖期数”文本框中的内容} else {// 添加购买号码失败noteLabel.setText("购买失败!");// 设置“购买状态”标签内容}}}// “关闭”按钮动作事件的监听protected void do_btnNewButton_1_actionPerformed(ActionEvent e) {this.setVisible(false);// 使随机选号对话框不可见}// 复选框的选项事件private String itemEvent(JCheckBox ckBox, JTextField tf) {ckBox.addItemListener(new ItemListener() {public void itemStateChanged(ItemEvent e) {if (e.getStateChange() == ItemEvent.SELECTED) {// 复选框被选中tf.setEnabled(true);// 启用复选框tf.setText("1");// 设置文本框中的内容为1} else if (e.getStateChange() == ItemEvent.DESELECTED) {// 复选框没被选中tf.setText("");// 清空文本框中的内容tf.setEnabled(false);// 禁用复选框}}});return ckBox.getText() + ":" + tf.getText();// 返回复选框与文本框中的文本内容}// 将文本框的内容转换为int型private int exchangeInteger(JTextField tf) {int number;// 存储文本框中的数值if ("".equals(tf.getText())) {// 文本框中没有内容number = 0;// 文本框中的数值为0} else {// 文本框中有内容number = Integer.parseInt(tf.getText());// 将文本框中的数值转换为int型}return number;// 返回文本框中的数值}
}

7、第一位开奖趋势走向面板

package com.allpanel;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.border.EmptyBorder;import org.jfree.ui.RefineryUtilities;import com.allchart.ALineChart;
import com.db.ConnMySQL;
import com.frame.BackgroundPanel;public class Apanel extends JPanel {public Apanel() {// 第一位开奖号码的走势面板this.setBorder(new EmptyBorder(5, 5, 5, 5));// 设置第一位开奖号码走势面板的边框样式setLayout(new BorderLayout(0, 0));// 设置第一位开奖号码走势面板的布局为边界布局BackgroundPanel contentPane = new BackgroundPanel();// 创建自定义背景面板// 设置背景面板的图片contentPane.setImage(getToolkit().getImage(getClass().getResource("/imgs/a9.png")));add(contentPane, BorderLayout.CENTER);// 添加背景面板到第一位开奖号码走势面板的中间contentPane.setLayout(null);// 设置背景面板的布局为绝对布局// “各个数字在该位所出现的百分比”标签JLabel lblNewLabel = new JLabel("各个数字在该位所出现的百分比");// 设置“各个数字在该位所出现的百分比”标签的位置和宽高lblNewLabel.setBounds(175, 12, 217, 18);// 把“各个数字在该位所出现的百分比”标签添加到背景面板中contentPane.add(lblNewLabel);JLabel label = new JLabel("1:");// “1:”标签label.setBounds(60, 91, 27, 18);// 设置“1:”标签的位置和宽高contentPane.add(label);// 把“1:”标签添加到背景面板中JLabel label_1 = new JLabel("2:");// “2:”标签label_1.setBounds(60, 136, 27, 18);// 设置“2:”标签的位置和宽高contentPane.add(label_1);// 把“2:”标签添加到背景面板中JLabel label_2 = new JLabel("4:");// “4:”标签label_2.setBounds(60, 226, 27, 18);// 设置“4:”标签的位置和宽高contentPane.add(label_2);// 把“4:”标签添加到背景面板中JLabel label_3 = new JLabel("3:");// “3:”标签label_3.setBounds(60, 181, 27, 18);// 设置“3:”标签的位置和宽高contentPane.add(label_3);// 把“3:”标签添加到背景面板中JLabel label_4 = new JLabel("5:");// “5:”标签label_4.setBounds(60, 274, 27, 18);// 设置“5:”标签的位置和宽高contentPane.add(label_4);// 把“5:”标签添加到背景面板中JLabel label_5 = new JLabel("6:");// “6:”标签label_5.setBounds(60, 319, 27, 18);// 设置“6:”标签的位置和宽高contentPane.add(label_5);// 把“6:”标签添加到背景面板中JLabel label_6 = new JLabel("7:");// “7:”标签label_6.setBounds(60, 364, 27, 18);// 设置“7:”标签的位置和宽高contentPane.add(label_6);// 把“7:”标签添加到背景面板中JLabel label_7 = new JLabel("8:");// “8:”标签label_7.setBounds(60, 409, 27, 18);// 设置“8:”标签的位置和宽高contentPane.add(label_7);// 把“8:”标签添加到背景面板中JLabel label_8 = new JLabel("9:");// “9:”标签label_8.setBounds(60, 454, 27, 18);// 设置“9:”标签的位置和宽高contentPane.add(label_8);// 把“9:”标签添加到背景面板中JLabel label_9 = new JLabel("0:");// “0:”标签label_9.setBounds(60, 44, 27, 29);// 设置“0:”标签的位置和宽高contentPane.add(label_9);// 把“0:”标签添加到背景面板中JProgressBar progressBar_0 = new JProgressBar();// 与“0:”标签对应的进度条progressBar_0.setBounds(94, 43, 321, 32);// 设置与“0:”标签对应的进度条的位置和宽高progressBar_0.setForeground(new Color(255, 165, 0));// 设置与“0:”标签对应的进度条的前景色progressBar_0.setStringPainted(true);// 设置与“0:”标签对应的进度条呈现的进度字符串// 设置与“0:”标签对应的进度条的字体样式和大小progressBar_0.setFont(new Font("微软雅黑", Font.PLAIN, 14));contentPane.add(progressBar_0);// 把与“0:”标签对应的进度条添加到背景面板中JProgressBar progressBar_1 = new JProgressBar();// 与“1:”标签对应的进度条progressBar_1.setBounds(94, 85, 321, 32);// 设置与“1:”标签对应的进度条的位置和宽高progressBar_1.setForeground(new Color(255, 165, 0));// 设置与“1:”标签对应的进度条的前景色progressBar_1.setStringPainted(true);// 设置与“1:”标签对应的进度条呈现的进度字符串// 设置与“1:”标签对应的进度条的字体样式和大小progressBar_1.setFont(new Font("微软雅黑", Font.PLAIN, 14));contentPane.add(progressBar_1);// 把与“1:”标签对应的进度条添加到背景面板中JProgressBar progressBar_2 = new JProgressBar();// 与“2:”标签对应的进度条progressBar_2.setBounds(94, 130, 321, 32);// 设置与“2:”标签对应的进度条的位置和宽高progressBar_2.setForeground(new Color(255, 165, 0));// 设置与“2:”标签对应的进度条的前景色progressBar_2.setStringPainted(true);// 设置与“1:”标签对应的进度条呈现的进度字符串// 设置与“2:”标签对应的进度条的字体样式和大小progressBar_2.setFont(new Font("微软雅黑", Font.PLAIN, 14));contentPane.add(progressBar_2);// 把与“2:”标签对应的进度条添加到背景面板中JProgressBar progressBar_3 = new JProgressBar();// 与“3:”标签对应的进度条progressBar_3.setBounds(94, 175, 321, 32);// 设置与“3:”标签对应的进度条的位置和宽高progressBar_3.setForeground(new Color(255, 165, 0));// 设置与“3:”标签对应的进度条的前景色progressBar_3.setStringPainted(true);// 设置与“3:”标签对应的进度条呈现的进度字符串// 设置与“3:”标签对应的进度条的字体样式和大小progressBar_3.setFont(new Font("微软雅黑", Font.PLAIN, 14));contentPane.add(progressBar_3);// 把与“3:”标签对应的进度条添加到背景面板中JProgressBar progressBar_4 = new JProgressBar();// 与“4:”标签对应的进度条progressBar_4.setBounds(94, 220, 321, 32);// 设置与“4:”标签对应的进度条的位置和宽高progressBar_4.setForeground(new Color(255, 165, 0));// 设置与“4:”标签对应的进度条的前景色progressBar_4.setStringPainted(true);// 设置与“4:”标签对应的进度条呈现的进度字符串// 设置与“4:”标签对应的进度条的字体样式和大小progressBar_4.setFont(new Font("微软雅黑", Font.PLAIN, 14));contentPane.add(progressBar_4);// 把与“4:”标签对应的进度条添加到背景面板中JProgressBar progressBar_5 = new JProgressBar();// 与“5:”标签对应的进度条progressBar_5.setBounds(94, 268, 321, 32);// 设置与“5:”标签对应的进度条的位置和宽高progressBar_5.setForeground(new Color(255, 165, 0));// 设置与“5:”标签对应的进度条的前景色progressBar_5.setStringPainted(true);// 设置与“5:”标签对应的进度条呈现的进度字符串// 设置与“5:”标签对应的进度条的字体样式和大小progressBar_5.setFont(new Font("微软雅黑", Font.PLAIN, 14));contentPane.add(progressBar_5);// 把与“5:”标签对应的进度条添加到背景面板中JProgressBar progressBar_6 = new JProgressBar();// 与“6:”标签对应的进度条progressBar_6.setBounds(94, 313, 321, 32);// 设置与“6:”标签对应的进度条的位置和宽高progressBar_6.setForeground(new Color(255, 165, 0));// 设置与“6:”标签对应的进度条的前景色progressBar_6.setStringPainted(true);// 设置与“6:”标签对应的进度条呈现的进度字符串// 设置与“6:”标签对应的进度条的字体样式和大小progressBar_6.setFont(new Font("微软雅黑", Font.PLAIN, 14));contentPane.add(progressBar_6);// 把与“6:”标签对应的进度条添加到背景面板中JProgressBar progressBar_7 = new JProgressBar();// 与“7:”标签对应的进度条progressBar_7.setBounds(94, 358, 321, 32);// 设置与“7:”标签对应的进度条的位置和宽高progressBar_7.setForeground(new Color(255, 165, 0));// 设置与“7:”标签对应的进度条的前景色progressBar_7.setStringPainted(true);// 设置与“7:”标签对应的进度条呈现的进度字符串// 设置与“7:”标签对应的进度条的字体样式和大小progressBar_7.setFont(new Font("微软雅黑", Font.PLAIN, 14));contentPane.add(progressBar_7);// 把与“7:”标签对应的进度条添加到背景面板中JProgressBar progressBar_8 = new JProgressBar();// 与“8:”标签对应的进度条progressBar_8.setBounds(94, 403, 321, 32);// 设置与“8:”标签对应的进度条的位置和宽高progressBar_8.setForeground(new Color(255, 165, 0));// 设置与“8:”标签对应的进度条的前景色progressBar_8.setStringPainted(true);// 设置与“8:”标签对应的进度条呈现的进度字符串// 设置与“8:”标签对应的进度条的字体样式和大小progressBar_8.setFont(new Font("微软雅黑", Font.PLAIN, 14));contentPane.add(progressBar_8);// 把与“8:”标签对应的进度条添加到背景面板中JProgressBar progressBar_9 = new JProgressBar();// 与“9:”标签对应的进度条progressBar_9.setBounds(94, 448, 321, 32);// 设置与“9:”标签对应的进度条的位置和宽高progressBar_9.setForeground(new Color(255, 165, 0));// 设置与“9:”标签对应的进度条的前景色progressBar_9.setStringPainted(true);// 设置与“9:”标签对应的进度条呈现的进度字符串// 设置与“9:”标签对应的进度条的字体样式和大小progressBar_9.setFont(new Font("微软雅黑", Font.PLAIN, 14));contentPane.add(progressBar_9);// 把与“9:”标签对应的进度条添加到背景面板中JLabel l_0 = new JLabel("");// 统计0出现的次数标签l_0.setBounds(439, 49, 104, 18);// 设置统计0出现的次数标签的位置和宽高contentPane.add(l_0);// 把统计0出现的次数标签添加到背景面板中JLabel l_1 = new JLabel("");// 统计1出现的次数标签l_1.setBounds(439, 91, 104, 18);// 设置统计1出现的次数标签的位置和宽高contentPane.add(l_1);// 把统计1出现的次数标签添加到背景面板中JLabel l_2 = new JLabel("");// 统计2出现的次数标签l_2.setBounds(439, 136, 104, 18);// 设置统计2出现的次数标签的位置和宽高contentPane.add(l_2);// 把统计2出现的次数标签添加到背景面板中JLabel l_3 = new JLabel("");// 统计3出现的次数标签l_3.setBounds(439, 181, 104, 18);// 设置统计3出现的次数标签的位置和宽高contentPane.add(l_3);// 把统计3出现的次数标签添加到背景面板中JLabel l_4 = new JLabel("");// 统计4出现的次数标签l_4.setBounds(439, 226, 104, 18);// 设置统计4出现的次数标签的位置和宽高contentPane.add(l_4);// 把统计4出现的次数标签添加到背景面板中JLabel l_5 = new JLabel("");// 统计5出现的次数标签l_5.setBounds(439, 274, 104, 18);// 设置统计5出现的次数标签的位置和宽高contentPane.add(l_5);// 把统计5出现的次数标签添加到背景面板中JLabel l_6 = new JLabel("");// 统计6出现的次数标签l_6.setBounds(439, 319, 104, 18);// 设置统计6出现的次数标签的位置和宽高contentPane.add(l_6);// 把统计6出现的次数标签添加到背景面板中JLabel l_7 = new JLabel("");// 统计7出现的次数标签l_7.setBounds(439, 364, 104, 18);// 设置统计7出现的次数标签的位置和宽高contentPane.add(l_7);// 把统计7出现的次数标签添加到背景面板中JLabel l_8 = new JLabel("");// 统计8出现的次数标签l_8.setBounds(439, 409, 104, 18);// 设置统计8出现的次数标签的位置和宽高contentPane.add(l_8);// 把统计8出现的次数标签添加到背景面板中JLabel l_9 = new JLabel("");// 统计9出现的次数标签l_9.setBounds(439, 454, 104, 18);// 设置统计9出现的次数标签的位置和宽高contentPane.add(l_9);// 把统计9出现的次数标签添加到背景面板中ConnMySQL con = new ConnMySQL();// 连接MySQL数据库String ab = "a";// 第一位开奖号码int i0 = con.getABC(ab, 0);// 获得第一位开奖号码0出现的次数con.closeConnection();// 关闭数据库连接int i1 = con.getABC(ab, 1);// 获得第一位开奖号码1出现的次数con.closeConnection();// 关闭数据库连接int i2 = con.getABC(ab, 2);// 获得第一位开奖号码2出现的次数con.closeConnection();// 关闭数据库连接int i3 = con.getABC(ab, 3);// 获得第一位开奖号码3出现的次数con.closeConnection();// 关闭数据库连接int i4 = con.getABC(ab, 4);// 获得第一位开奖号码4出现的次数con.closeConnection();// 关闭数据库连接int i5 = con.getABC(ab, 5);// 获得第一位开奖号码5出现的次数con.closeConnection();// 关闭数据库连接int i6 = con.getABC(ab, 6);// 获得第一位开奖号码6出现的次数con.closeConnection();// 关闭数据库连接int i7 = con.getABC(ab, 7);// 获得第一位开奖号码7出现的次数con.closeConnection();// 关闭数据库连接int i8 = con.getABC(ab, 8);// 获得第一位开奖号码8出现的次数con.closeConnection();// 关闭数据库连接int i9 = con.getABC(ab, 9);// 获得第一位开奖号码9出现的次数con.closeConnection();// 关闭数据库连接// 设置统计开奖号码出现次数标签中的文本内容l_0.setText("出现 " + i0 + " 次");l_1.setText("出现 " + i1 + " 次");l_2.setText("出现 " + i2 + " 次");l_3.setText("出现 " + i3 + " 次");l_4.setText("出现 " + i4 + " 次");l_5.setText("出现 " + i5 + " 次");l_6.setText("出现 " + i6 + " 次");l_7.setText("出现 " + i7 + " 次");l_8.setText("出现 " + i8 + " 次");l_9.setText("出现 " + i9 + " 次");double all = i0 + i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9;// 获得开奖次数DecimalFormat df = new DecimalFormat(".###");// 格式化(保留三位有效数字)// 设置被格式化的进度字符串的值,并设置进图条当前值progressBar_0.setString(df.format(i0 * 100 / all) + "%");progressBar_0.setValue(i0);progressBar_1.setString(df.format(i1 * 100 / all) + "%");progressBar_1.setValue(i1);progressBar_2.setString(df.format(i2 * 100 / all) + "%");progressBar_2.setValue(i2);progressBar_3.setString(df.format(i3 * 100 / all) + "%");progressBar_3.setValue(i3);progressBar_4.setString(df.format(i4 * 100 / all) + "%");progressBar_4.setValue(i4);progressBar_5.setString(df.format(i5 * 100 / all) + "%");progressBar_5.setValue(i5);progressBar_6.setString(df.format(i6 * 100 / all) + "%");progressBar_6.setValue(i6);progressBar_7.setString(df.format(i7 * 100 / all) + "%");progressBar_7.setValue(i7);progressBar_8.setString(df.format(i8 * 100 / all) + "%");progressBar_8.setValue(i8);progressBar_9.setString(df.format(i9 * 100 / all) + "%");progressBar_9.setValue(i9);JButton button = new JButton();// 按钮button.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {do_button_actionPerformed(e);// 为按钮添加动作事件的监听}});button.setBounds(94, 485, 321, 32);// 设置按钮的位置和宽高button.setText("查看最近10期的第一位开奖号码走势图");// 设置按钮中的文本内容button.setFont(new Font("幼圆", Font.PLAIN, 16));// 设置按钮中的字体样式和大小button.setForeground(new Color(0, 102, 153));// 设置按钮的前景色contentPane.add(button);// 把按钮添加到背景面板中}// “查看最近10期的第一位开奖号码走势图”动作事件的监听protected void do_button_actionPerformed(ActionEvent e) {// 创建“第一位开奖号码走势图”折线图窗体对象ALineChart chart = new ALineChart(null, "第一位开奖号码走势图");chart.pack();// 调整窗口的大小,以适应折线图对象的首选大小和布局RefineryUtilities.centerFrameOnScreen(chart);// 将折线图对象置于屏幕中间chart.setVisible(true);// 设置折线图窗体对象可见}
}

五、效果图

六、运行时出现的错误及改正方法

1、com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

这类属于数据库与jdbc的通讯链故障。

被这个问题困扰类不少时间,网上帖子看了一遍有一遍,归纳了3种解决方式:

a、首先考虑 配置文件/etc/mysql/my.cnf
    网上说是出现这个问题是因为超时,数据库连接(java.sql.Connection)连接关闭,因此可以设置连接最长时间,wait_timeout的默认最长时间是28800秒,也就是8小时时间

以root打开该文件:sudo gedit /etc/mysql/my.cnf

再末尾添加:

[mysqld]
     wait_timeout=31536000
     interactive_timeout=31536000

保存退出

b、考虑是否是驱动版本问题,比如:将mysql-connector-java-5.1.14-bin.jar换成mysql-connector-java-5.1.19-bin.jar试试;

c、将 String url = "jdbc:mysql://localhost:3306/test";//?autoReconnect=true&failOverReadOnly=false

中的localhost换成127.0.0.1

最后我是的方法c解决的问题。

2、org.hibernate.exception.JDBCConnectionException:could not execute query

好吧,这个方法我是在网上借鉴大神的:https://blog.csdn.net/xingyunpi/article/details/7216599

3、Unknown initial character set index '255' received from server. Initial client character set can be

这是mysql的连接错误,在网上查找到是编码不匹配的原因,

但是确认了一遍没找到编码不是utf8的情况,

直接在连接的URL后加上?useUnicode=true&characterEncoding=utf8就可以了

4、java.lang.ClassNotFoundException: com.sun.java.swing.plaf.nimbus.NimbusLookAmdFeel

这个问题一直没解决的了,但是不影响软件的运行,主要是在网上搜了几种方法都没能解决的了。

七、总结

其实在这个项目中让我从一个java小小白成功升级为一名小白,这是我的一个练手小项目且是第一个跑成功的项目,之前都一直学习理论,真正到实际项目中时才发现,其实平时跟着别人敲的小Demo也很有用,但是一定要去理会和多去训练。还有就是其实在实践过程中遇见的各种报错Bug要多总结。

总之,这是我跨出的第一步,后面的路还很长,加油!!!

学习路上:多学习,多实践,多总结。

共勉!!!

学习java的第一个实践练手项目---彩票预测系统相关推荐

  1. 10个相见恨晚的 Java 在线练手项目

    前一篇:?[清单]37个超棒的 Web 数据可视化工具 Java 开发简单的计算器 难度为一般,适合具有 Java 基础和 Swing 组件编程知识的用户学习 推荐指数:????? 在线实操链接 制作 ...

  2. 33 个送给 Java 程序员的练手项目合集

    人类一生中,99% 的技能都是靠实践学来的,编程更是如此. 人类一生中,99% 的技能都是靠实践学来的,编程更是如此. 在这一点上,编程和打篮球很像:你得亲自上场去打,才能学会篮球:同样,亲手敲下代码 ...

  3. java编程计算器程序代码_34 个送给 Java 程序员的练手项目合集

    人类一生中,99% 的技能都是靠实践学来的,编程更是如此. 在这一点上,编程和打篮球很像:你得亲自上场去打,才能学会篮球:同样,亲手敲下代码,才能真正学会「编程」.太多人看完一本书.几个 G 的视频后 ...

  4. java练手代码大全手机版_20个Java练手项目,献给嗜血如狂的你

    过年了都放假了,宅在家给大家推荐一条由浅入深的JAVA学习路径,首先完成 Java基础.JDK.JDBC.正则表达式等基础实验,然后进阶到 J2SE 和 SSH 框架学习.最后再通过有趣的练手项目进行 ...

  5. 个 java的_20个Java练手项目,献给嗜血如狂的你

    给大家推荐一条由浅入深的JAVA学习路径,首先完成 Java基础.JDK.JDBC.正则表达式等基础实验,然后进阶到 J2SE 和 SSH 框架学习.最后再通过有趣的练手项目进行巩固. JAVA基础 ...

  6. java练手代码大全手机版_20个Java练手项目,献给嗜血如狂的人

    给大家推荐一条由浅入深的JAVA学习路径,首先完成 Java基础.JDK.JDBC.正则表达式等基础实验,然后进阶到 J2SE 和 SSH 框架学习.最后再通过有趣的练手项目进行巩固: JAVA基础 ...

  7. 整理10类Java毕设练手项目,献给帅帅的计算计专业毕业人

    每次到了写毕业设计的时候,计算机专业的同学们就开始头疼,想自己写,但是大学学的东西...一言难尽,远远不足以支撑我们写出一个完整的项目:就算学的比较好的同学,会写一两个项目,到了选题的时候,傻眼了,刚 ...

  8. 百看不如一练,55个Java练手项目(附源码+视频教程),全都在这里了

    我们都知道,不管学习那门语言最终都要做出实际的东西来,而对于编程而言,这个实际的东西当然就是项目啦,不用我多说大家都知道学编程语言做项目的重要性. 于是,我熬了几个通宵,终于整理出了55个培训机构内部 ...

  9. Java黄金矿工小游戏,适合新手入门练手项目

    Java初学者的小伙伴们,相信大家肯定缺少很多的练手项目吧!今天就给大家推荐一款特别好上手的一个Java小游戏--黄金矿工. 大家听到这个名字的时候,童年的回忆肯定一下子,涌上心头,那如果让大家制作一 ...

最新文章

  1. 16:9或4:3,哪种屏幕宽高比更适合用户?
  2. linux中多线程解析
  3. 三种常用SoC片上总线的分析与比较 (Z)
  4. 怎么用python做战斗机_关于python文件操作
  5. JDK9.0.4环境变量配置
  6. [Linux] BASH程序设计
  7. [Python] numpy库的简介和常用函数
  8. (Sublime Text 3)完美替换 GAMS 难用的编辑器
  9. Shell笔记5——函数的知识与实践
  10. CMP?MSP?1+1才能大于2
  11. Java国密算法加密
  12. 【通信原理 入坑之路】—— 深入理解奈奎斯特第一准则与码间串扰
  13. 基于深度学习的多目标跟踪(MOT)技术一览
  14. 通过IMAP方式迁移U-Mail邮件到Exchange 2013之2008R2 AD搭建!
  15. Godaddy域名push教程(域名转出教程)
  16. 大数据薪水大概多少_大数据工资一般多少
  17. Docker学习之三:docker镜像管理
  18. php 验证邮箱 php验证手机号码 ph验证身份证
  19. 十进制如何转化成二进制c语言,c语言怎么将十进制转化成二进制
  20. ORACLE PL/SQL编程之六: 把过程与函数说透

热门文章

  1. 17.03.05校内训练: 万圣节服饰
  2. 将PHP开发的网站分布式部署,如何进行分布式部署
  3. vue--实现todo案例
  4. 自定义控件:快速索引
  5. python开发鸡兔同笼
  6. 电压,电流,电阻的关系就是欧姆定律
  7. Python中删除字符串末尾的指定字符rstrip()方法
  8. Java实现判断休息日和节假日
  9. python random模块下载,Python的random模块
  10. 浅谈Endpoint