这个项目用了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;// 初始化最大行数为0
	private int currentPageNumber = 1;// 初始化表格的当前页数为1
	private 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;// 将当前页码设置成1
		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(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~9
	private 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);
	}

	@Override
	public 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不能大于10
						i = 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 + 1
						Thread.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);
					}
				}
			}
			// 集合中的元素个数小于7
			while (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<>();// “号码”集合中元素索引的集合
			// 集合中的元素个数小于7
			while (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 + 1
					Thread.sleep(0);// 线程不休眠
					index++;// index = index + 1
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	@Override
	public 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/myf
    网上说是出现这个问题是因为超时,数据库连接(java.sql.Connection)连接关闭,因此可以设置连接最长时间,wait_timeout的默认最长时间是28800秒,也就是8小时时间

     以root打开该文件:sudo gedit /etc/mysql/myf

     再末尾添加:

     [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/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的第一个实践练手项目---彩票预测系统