这个项目用了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 getFirstTenData() {// 获得最近10期的开奖结果
// 获得最近10期开奖号码的SQL语句
String sql = "SELECT * FROM tb_history ORDER BY number DESC LIMIT 10";
List 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 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 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/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要多总结。
总之,这是我跨出的第一步,后面的路还很长,加油!!!
学习路上:多学习,多实践,多总结。
共勉!!!