这个项目是课程设计的时候随手写的,没有去考虑过规范效率优美这些东西,但是还是写出来记录一下吧。说不定能给某个看到的人一点思路。
package dn.dmandp.maingui;
import java.awt.Dimension;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
/**
*@author 杨 Email mengxiangzuojia@163.com
*@version 1.0
*@date 17 Nov 2017 17:57:53
*
*/
public class ImagicLabel extends JLabel{
private static final long serialVersionUID = 1L;
ImagicLabel(ImageIcon icon){
setPreferredSize(new Dimension(100,100));
setSize(100,100);
setIcon(icon);
setHorizontalAlignment(SwingConstants.CENTER);
}
}
上面这个类没什么特殊意义,就是用来方便初始化的时候传图片。
下面是主类:
package dn.dmandp.maingui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
/**
*@author 杨 Email mengxiangzuojia@163.com
*@version 1.0
*@date 17 Nov 2017 17:14:36
*
*/
public class MainGui implements ActionListener{
private JFrame mainFrame=new JFrame();
private JPanel mainPanel=new JPanel();
private JPanel workPanel=new JPanel();
private JButton startbutton=new JButton("开始");
private JButton topbutton=new JButton("排行榜");
private ImagicLabel[] labels=new ImagicLabel[9];//标签数组
private ImageIcon[] images=new ImageIcon[9];//图片数组
private long starttime,endtime;//开始时间,结束时间
private int currentimage=8;//当前空白图位置0~8
private int[] order=new int[9];//顺序数组
private int[] random=new int[9];//打乱顺序后的数组
static Connection con=null;
static Statement statement=null;
static {
String driver ="com.mysql.jdbc.Driver";//数据库相关的一些东西,存放成绩,如果不要的话也不影响主体功能
String url="jdbc:mysql://localhost:3306/opendata";
String sqluser="openuser";
String sqlpassword="123abc";
try {
Class.forName(driver);
con=DriverManager.getConnection(url,sqluser,sqlpassword);
if(!con.isClosed()){
System.out.println("Successded connecting to mysql!");
}
statement=con.createStatement();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*构造函数
*/
MainGui(){
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());//设置UI风格为系统风格
} catch (Exception e) {
e.printStackTrace();
}
mainFrame.setTitle("拼图");
mainFrame.setSize(310,365);
mainFrame.setLocationRelativeTo(null);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setResizable(false);
startbutton.addActionListener(this);
topbutton.addActionListener(this);
workPanel.add(startbutton);
workPanel.add(topbutton);
mainPanel.setLayout(new GridLayout(3,3,2,2));
mainPanel.setPreferredSize(new Dimension(300,300));
for(int i=0;i<9;i++){
order[i]=i;
images[i]=new ImageIcon("D:/sigsaw/leimu/leimu"+i+".jpg");//这个看自己情况自行更改
labels[i]=new ImagicLabel(images[i]);
labels[i].addMouseListener(new MouseAdapter(){//标签鼠标监听
@Override
public void mouseClicked(MouseEvent e) {
for(int click=0;click<9;click++){
if((ImagicLabel)e.getSource()==labels[click]){
changeAndCheck(click);
}
}
}
});
mainPanel.add(labels[i]);
}
mainFrame.add(mainPanel,BorderLayout.SOUTH);
mainFrame.add(workPanel,BorderLayout.NORTH);
mainFrame.setVisible(true);
}
/**
*保存成绩
*/
private void savegrade(String name,Double usetime) {
try{
String sql="insert into jigsaw(name,usetime) values('"+name+"',"+usetime+");";
if(statement.executeUpdate(sql)==1){
System.out.println("successded to save");
}else{
System.out.println("failed to save");
}
}catch (Exception e) {
e.printStackTrace();
}finally{
}
}
/**
*动作监听
*/
@Override
public void actionPerformed(ActionEvent e) {
if((JButton)e.getSource()==startbutton){
setRandom();
for(int i=0;i<9;i++){
labels[i].setIcon(images[random[i]]);
order[i]=i;
}
startbutton.setText("重新开始");
currentimage=8;
starttime=System.currentTimeMillis();
}else if((JButton)e.getSource()==topbutton){
getgrades();
}
}
/**
*获取成绩
*/
private void getgrades() {
String sql="select * from jigsaw order by usetime asc";
try {
ResultSet rs=statement.executeQuery(sql);
String grade="";
int i=0;
while(rs.next()&&i<10){
i++;
grade=grade+"名次:"+i+" "+rs.getString("name")+" 用时:"+rs.getDouble("usetime")+"秒 "+rs.getTimestamp("createdate")+"\r\n";
}
JOptionPane.showMessageDialog(null,grade,"排行榜",JOptionPane.PLAIN_MESSAGE);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
*改变并检查是否完成
*/
public void changeAndCheck(int click){
if(click-currentimage==1||click-currentimage==3||click-currentimage==-1||click-currentimage==-3){
labels[currentimage].setIcon(labels[click].getIcon());
random[currentimage]=random[click];
random[click]=8;
currentimage=click;
labels[click].setIcon(images[8]);
}else{
return;
}
for(int i=0;i<9;i++){
if(random[i]!=order[i]){
return;
}
}
endtime=System.currentTimeMillis();
String name=(String) JOptionPane.showInputDialog(null,"恭喜你完成拼图!用时"+(double)(endtime-starttime)/1000+"秒","完成啦!",JOptionPane.PLAIN_MESSAGE,null,null,"请输入你的名字");
order[8]=0;
if(name!=null){
savegrade(name,(double)(endtime-starttime)/1000);
}
}
/**
*打乱图片
*/
public void setRandom(){
for(int i=8,j=0;j<8;j++,i--){
int index=(int)(Math.random()*i);
random[j]=order[index];
order[index]=order[i-1];
}
random[8]=8;
int coverPairCount = 0;
for (int i=0;i<8;++i){
for (int j=i+1;j<8;++j){
if (random[i]>random[j])
coverPairCount++;
}
}
if(coverPairCount%2!=0){
int tmp=random[7];
random[7]=random[6];
random[6]=tmp;
}
}
/**
*主函数
*/
public static void main(String args[]){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
new MainGui();
}
});
}
}
具体也没什么好说的,感觉已经注释的差不多了。就是放九个标签,每个标签一张图。点击空白图四周的标签就可以跟空白图交换~就这样吧233