使用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都是可以的。

效果圖:

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章