使用java的swing组建写拼图

直接上代码吧,并不是特别难以理解的东西 就不多说了

开始类:

public class demo extends JFrame{

	static demo jfr = new demo();

	static String path = "";
	//拼图矩阵
	static Icon[][] icon = new ImageIcon[3][3];
	static int map[][] = new int[3][3];
	//初始设置
	static JButton[][] button = new JButton[3][3];
	static JMenuBar menubar = new JMenuBar();
	static JMenu menu = new JMenu("开始");
	static JMenuItem menuitem = new JMenuItem("重置");
	public static void main(String[] args){
		jfr.setSize(400,400);
		jfr.setLayout(new GridLayout(4,4));
	
		demo.init_Frame();
		
		menu.add(menuitem);
		menubar.add(menu);
		jfr.setJMenuBar(menubar);
		jfr.setTitle("Game");
		jfr.setVisible(true);
		jfr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			
	}	
	
	private static void init_Frame(){
		int i,j = 0,x=0;
		int count = 0;
		int x1 = 0;
		//初始化矩阵数组
		for(i=0;i<button.length;i++)
			for(j=0;j<button[i].length;j++){
				map[i][j] = x1++;
			}
		//初始化按钮并设置图片
		for(i=0;i<button.length;i++)
			for(j=0;j<button[i].length;j++){
				path = "src//pic//"+String.valueOf(count++)+".png";
				icon[i][j] = new ImageIcon(path);
				button[i][j] = new JButton(icon[i][j]);
			}	
				
		//添加监听者
		for(i=0;i<button.length;i++)
			for(j=0;j<button[i].length;j++)
				button[i][j].addActionListener(new Mylistener());

		//加入按钮
		for(i=0;i<button.length;i++)
			for(j=0;j<button[i].length;j++)
				jfr.add(button[i][j]);
		//重置游戏事件
		menuitem.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				demo.resetGame();
			}					
		});
	}
	
	private static void resetGame(){
		int i,j = 0,x=0;
		int count = 0;
		int x1 = 0;
		//初始化矩阵数组
		for(i=0;i<button.length;i++)
			for(j=0;j<button[i].length;j++){
				map[i][j] = x1++;
			}
		
		for(i=0;i<button.length;i++)
			for(j=0;j<button[i].length;j++){
				button[i][j].setIcon(icon[i][j]);
			}	
				
	}

	public static JButton[][] getButton(){
		return button;
	}
	
	public static int[][] getMap(){
		return map;
	}
	
}

事件监听:拼图控制

public class Mylistener implements ActionListener {

	JButton jbt;
	JButton[][] button;
	Icon[][] icon;
	Icon temp1,temp2,temp3;
	String str;
	//数组矩阵地图
	int[][] map;
	int maptemp;
 	public void actionPerformed(ActionEvent e){
 		int i,j = 0;
 		int flag = 0;
 		int row,col = 0;
 		map = demo.getMap();
		jbt = (JButton)e.getSource();
		button = demo.getButton();
		//获取空白图像的坐标
		for(i=0;i<map.length;i++){
			for(j=0;j<map[i].length;j++){
				if(map[i][j]==0){
					flag = 1;
					break;
				}
			}	
			if(flag == 1) break;
		}
		flag = 0;
		System.out.println("数组矩阵坐标:"+i+"  "+j);
		
		//获取点击事件对象的坐标
		for(row=0;row<button.length;row++){
			for(col=0;col<button[row].length;col++){
				if(jbt==button[row][col]){
					flag = 1;
					break;
				}
			}	
			if(flag==1) break;
		}
		
		System.out.println("点击按钮坐标:"+row+"  "+col);
		//判断空白处是否在点击按钮的上下左右位置,如果是则交换 
		if((row==i-1 && col==j)||(row==i+1 && col==j)
				||(row==i && col==j+1)||(row==i && col==j-1)){
			//对矩阵中的值进行交换
			maptemp = map[row][col];
			map[row][col] = 0;
			map[i][j] = maptemp;
			//交换图像
			temp1 = jbt.getIcon();
			temp2 = button[i][j].getIcon();
			jbt.setIcon(temp2);
			button[i][j].setIcon(temp1);
			System.out.println(temp1);
		}

	}	
}

缺点还是有一些的。这个代码并不能直接的对一个完整的图像进行分割,而是我将图片分割好放进去的。工程目录如下

图片名字设置为1到16主要是为了初始化能用循环方便一些。

但是该代码只需要对矩阵的大小进行修改,便可将其从3*3转化为4*4,甚至10*10都是可以的。

效果图:

猜你喜欢

转载自blog.csdn.net/a1353206432/article/details/81867837
今日推荐