🍬 博主介紹👨?🎓 博主介紹:大家好,我是 hacker-routing ,很高興認識大家~
?主攻領域:【滲透領域】【應急響應】 【Java】 【VulnHub靶場復現】【面試分析】
🎉點贊?評論?收藏 == 養成習慣(一鍵三連)😋
🎉歡迎關注💗一起學習👍一起討論??一起進步📝文末有彩蛋
🙏作者水平有限,歡迎各位大佬指點,相互學習進步!
目錄
拼圖小游戲
練習
1、創建主界面1
代碼
2、創建主界面2
菜單制作
3、在游戲界面中添加菜單
代碼
4、添加圖片
游戲主界面添加組件
代碼
5、打亂圖片順序
練習
6、事件
1、動作監聽
2、鼠標監聽機制
3、鍵盤監聽
拼圖小游戲
練習
1、創建主界面1
- 到idea中創建一個寬603像素,高680像素的游戲主界面
- 到idea中創建一個寬488像素,高430像素的登錄界面
- 到idea中創建一個寬488像素,高500像素的注冊界面
代碼
測試類:test ,在這個測試類中,我們直接把三個Java用戶圖形化界面生成了,但是這樣三個功能界面全部都寫在同一個main函數里面,對于我們以后的代碼修改很不方便。
所以我們這里進行修改下,分別寫成單獨的類中。
package ui;import javax.swing.*;public class test {public static void main(String[] args) {//JFrame是JavaBean類描述界面的//屬性 (寬 高) 行為//1.創建一個游戲的主界面JFrame gameJFrame = new JFrame();gameJFrame.setSize(603,680);//單位是像素gameJFrame.setVisible(true);//2.創建一個登陸界面JFrame loginJFrame = new JFrame();loginJFrame.setSize(488,430);loginJFrame.setVisible(true);//3.創建一個注冊界面JFrame registerJFrame = new JFrame();registerJFrame.setSize(488,500);registerJFrame.setVisible(true);}
}
注冊界面:RegisterJFrame
package ui;import javax.swing.*;public class RegisterJFrame extends JFrame {//跟相關注冊界面的代碼,都寫里面public RegisterJFrame(){this.setSize(488,500);this.setVisible(true);}}
登錄界面:loginJFrame
package ui;import javax.swing.*;public class loginJFrame extends JFrame {//loginJFrame 表示登錄界面//以后所以跟登錄相關的代碼,都寫里面public loginJFrame(){this.setSize(488,430);this.setVisible(true);}}
游戲界面:GameJFrame
package ui;import javax.swing.*;public class GameJFrame extends JFrame {//JFrame 界面,窗體//子類呢?也表示界面,窗體//規定:GameJFrame這個界面表示的就是游戲的主界面//以后跟游戲相關的所有邏輯都寫在這個類中public GameJFrame(){this.setSize(603,680);//單位是像素this.setVisible(true);}}
程序的啟動入口:App
我們可以把test這個類刪掉了,我們可以直接俄利用App這個程序的啟動入口,我們需要啟動哪個界面,我們直接創建誰就可以了。
import ui.GameJFrame;
import ui.RegisterJFrame;
import ui.loginJFrame;public class App {public static void main(String[] args) {//表示程序的啟動入口//如果我們想要開啟一個界面,就創建誰的對象就好了new RegisterJFrame();new GameJFrame();new loginJFrame();}
}
2、創建主界面2
簡單初始化界面
public RegisterJFrame(){this.setSize(488,500);//設置界面的標題this.setTitle("拼圖 注冊");//設置界面置頂this.setAlwaysOnTop(true);//設置界面居中this.setLocationRelativeTo(null);//設置關閉模式this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//讓界面顯示出來this.setVisible(true);
菜單制作
3、在游戲界面中添加菜單
代碼
游戲界面:GameJFrame
package ui;import javax.swing.*;public class GameJFrame extends JFrame {//JFrame 界面,窗體//子類呢?也表示界面,窗體//規定:GameJFrame這個界面表示的就是游戲的主界面//以后跟游戲相關的所有邏輯都寫在這個類中public GameJFrame(){//初始化界面initJFrame();//初始化菜單initJMenuBar();//讓界面顯示出來,最后寫this.setVisible(true);}private void initJMenuBar() {//初始化菜單//創建整個的菜單對象JMenuBar jMenuBar = new JMenuBar();//創建菜單上面的兩個選項的對象 (功能 關于我們)JMenu fuctionJMenu = new JMenu("功能");JMenu aboutJMenu = new JMenu("關于我們");//創建選項下面的條目對象JMenuItem replayItem = new JMenuItem("重新游戲");JMenuItem reloginItem = new JMenuItem("重新登錄");JMenuItem closeItem = new JMenuItem("關閉游戲");JMenuItem accountItem = new JMenuItem("公眾號");//將每一個選項下的條目添加到對應的選項中fuctionJMenu.add(replayItem);fuctionJMenu.add(reloginItem);fuctionJMenu.add(closeItem);aboutJMenu.add(accountItem);//將菜單里面的兩個選項添加到菜單中jMenuBar.add(fuctionJMenu);jMenuBar.add(aboutJMenu);//給整個界面設置菜單this.setJMenuBar(jMenuBar);}private void initJFrame() {//設置界面的寬高this.setSize(603,680);//單位是像素//設置界面的標題this.setTitle("拼圖單機版 v1.0");//設置界面置頂this.setAlwaysOnTop(true);//設置界面居中this.setLocationRelativeTo(null);//設置關閉模式this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}}
測試類:App
import ui.GameJFrame;
import ui.RegisterJFrame;
import ui.loginJFrame;public class App {public static void main(String[] args) {//表示程序的啟動入口//如果我們想要開啟一個界面,就創建誰的對象就好了new GameJFrame();
// new RegisterJFrame();
// new loginJFrame();}
}
4、添加圖片
- 默認添加圖片顯示在正中央
多寫一個初始化圖片
package ui;import javax.swing.*;public class GameJFrame extends JFrame {//JFrame 界面,窗體//子類呢?也表示界面,窗體//規定:GameJFrame這個界面表示的就是游戲的主界面//以后跟游戲相關的所有邏輯都寫在這個類中public GameJFrame(){//初始化界面initJFrame();//初始化菜單initJMenuBar();//初始化圖片initimage();//讓界面顯示出來,最后寫mthis.setVisible(true);}//---------------------------------- ---------------------//初始化圖片private void initimage() {//1.創建一個圖片imageicon的對象ImageIcon icon = new ImageIcon("E:\\tool\\IDEA-java\\java代碼\\routing\\image\\animal\\animal3\\3.jpg");//2.創建一個Jlabel的對象(管理容器)JLabel JLabel = new JLabel(icon);//3.把管理容器添加到界面中this.add(JLabel);}private void initJMenuBar() {//初始化菜單//創建整個的菜單對象JMenuBar jMenuBar = new JMenuBar();//創建菜單上面的兩個選項的對象 (功能 關于我們)JMenu fuctionJMenu = new JMenu("功能");JMenu aboutJMenu = new JMenu("關于我們");//創建選項下面的條目對象JMenuItem replayItem = new JMenuItem("重新游戲");JMenuItem reloginItem = new JMenuItem("重新登錄");JMenuItem closeItem = new JMenuItem("關閉游戲");JMenuItem accountItem = new JMenuItem("公眾號");//將每一個選項下的條目添加到對應的選項中fuctionJMenu.add(replayItem);fuctionJMenu.add(reloginItem);fuctionJMenu.add(closeItem);aboutJMenu.add(accountItem);//將菜單里面的兩個選項添加到菜單中jMenuBar.add(fuctionJMenu);jMenuBar.add(aboutJMenu);//給整個界面設置菜單this.setJMenuBar(jMenuBar);}private void initJFrame() {//設置界面的寬高this.setSize(603,680);//單位是像素//設置界面的標題this.setTitle("拼圖單機版 v1.0");//設置界面置頂this.setAlwaysOnTop(true);//設置界面居中this.setLocationRelativeTo(null);//設置關閉模式this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}}
app運行:
import ui.GameJFrame;
import ui.RegisterJFrame;
import ui.loginJFrame;public class App {public static void main(String[] args) {//表示程序的啟動入口//如果我們想要開啟一個界面,就創建誰的對象就好了new GameJFrame();
// new RegisterJFrame();
// new loginJFrame();}
}
游戲主界面添加組件
代碼
//初始化圖片private void initimage() {//外循環 --把內循環重復執行了4次int number = 1;for (int i = 0; i < 4; i++) {//內循環 --表示在一行添加4張圖片for (int j = 0; j < 4; j++) {//1.創建一個Jlabel的對象(管理容器)JLabel JLabel = new JLabel(new ImageIcon("E:\\\\tool\\\\IDEA-java\\\\java代碼\\\\routing\\\\image\\\\animal\\\\animal3\\\\" + number +".jpg"));//2.指定圖片的位置JLabel.setBounds(105 * i,105 * j,105,105);//3.把管理容器添加到界面中this.getContentPane().add(JLabel);number++;}}
App 運行
import ui.GameJFrame;
import ui.RegisterJFrame;
import ui.loginJFrame;public class App {public static void main(String[] args) {//表示程序的啟動入口//如果我們想要開啟一個界面,就創建誰的對象就好了new GameJFrame();
// new RegisterJFrame();
// new loginJFrame();}
}
5、打亂圖片順序
練習
打亂一維數組中的數據
int[] tempArr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
要求:打亂一維數組中的數據,并按照4個一組的方式添加到二維數組中。
解法一:
package test;import java.util.Random;public class test1 {public static void main(String[] args) {//1.定義一個一維數組int[] temArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//2.打亂數組中的順序//遍歷數組,得到每一個元素,拿著每一個元素跟隨機索引上的數據進行交換Random r = new Random();for (int i = 0; i < temArr.length; i++) {//獲取到隨機索引int index = r.nextInt(temArr.length);//拿著每一個元素跟隨機索引上的數據進行交換int temp = temArr[i];temArr[i] = temArr[index];temArr[index] = temp;}//3.遍歷數組for (int i = 0; i < temArr.length; i++) {System.out.print(temArr[i] + " ");}System.out.println();//4.創建一個二維數組int[][] data = new int[4][4];//5.給二維數組添加數據//解法一://遍歷一維數組tempArr得到每一個元素,把每一個元素依次添加到數組當中for (int i = 0; i < temArr.length; i++) {data[i / 4][i % 4] = temArr[i];}//遍歷二維數組for (int i = 0; i < data.length; i++) {for (int j = 0; j < data[i].length; j++) {System.out.print(data[i][j] + " ");}System.out.println();}}
}
解法二:
package test;import java.util.Random;public class test2 {public static void main(String[] args) {//1.定義一個一維數組int[] temArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//2.打亂數組中的順序//遍歷數組,得到每一個元素,拿著每一個元素跟隨機索引上的數據進行交換Random r = new Random();for (int i = 0; i < temArr.length; i++) {//獲取到隨機索引int index = r.nextInt(temArr.length);//拿著每一個元素跟隨機索引上的數據進行交換int temp = temArr[i];temArr[i] = temArr[index];temArr[index] = temp;}//3.遍歷數組for (int i = 0; i < temArr.length; i++) {System.out.print(temArr[i] + " ");}System.out.println();//4.創建一個二維數組int[][] data = new int[4][4];//5.給二維數組添加數據//解法二://遍歷二維數組,給里面的每一個數據賦值int index = 0;for (int i = 0; i < data.length; i++) {for (int j = 0; j < data[i].length; j++) {data[i][j] = temArr[index];index++;}}//遍歷二維數組for (int i = 0; i < data.length; i++) {for (int j = 0; j < data[i].length; j++) {System.out.print(data[i][j] + " ");}System.out.println();}}
}
在GameJFrame編寫
package ui;import javax.swing.*;
import java.util.Random;public class GameJFrame extends JFrame {//JFrame 界面,窗體//子類呢?也表示界面,窗體//規定:GameJFrame這個界面表示的就是游戲的主界面//以后跟游戲相關的所有邏輯都寫在這個類中//創建一個二維數組//目的:加載圖片int[][] data = new int[4][4];public GameJFrame(){//初始化界面initJFrame();//初始化菜單initJMenuBar();//初始化數據(打亂)initdata();//初始化圖片(根據打亂之后的數據結果加載圖片)initimage();//讓界面顯示出來,最后寫mthis.setVisible(true);}//---------------------------------- ---------------------private void initdata() {//1.定義一個一維數組int[] temArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//2.打亂數組中的順序//遍歷數組,得到每一個元素,拿著每一個元素跟隨機索引上的數據進行交換Random r = new Random();for (int i = 0; i < temArr.length; i++) {//獲取到隨機索引int index = r.nextInt(temArr.length);//拿著每一個元素跟隨機索引上的數據進行交換int temp = temArr[i];temArr[i] = temArr[index];temArr[index] = temp;}//3.給二維數組添加數據//遍歷一維數組tempArr得到每一個元素,把每一個元素依次添加到數組當中for (int i = 0; i < temArr.length; i++) {data[i / 4][i % 4] = temArr[i];}}//初始化圖片private void initimage() {//外循環 --把內循環重復執行了4次for (int i = 0; i < 4; i++) {//內循環 --表示在一行添加4張圖片for (int j = 0; j < 4; j++) {//獲取當前要加載圖片的序號int num = data[i][j];//創建一個Jlabel的對象(管理容器)JLabel JLabel = new JLabel(new ImageIcon("E:\\\\tool\\\\IDEA-java\\\\java代碼\\\\routing\\\\image\\\\animal\\\\animal3\\\\" + num +".jpg"));//指定圖片的位置JLabel.setBounds(105 * i,105 * j,105,105);//把管理容器添加到界面中this.getContentPane().add(JLabel);}}//------------------------------------------------------}private void initJMenuBar() {//初始化菜單//創建整個的菜單對象JMenuBar jMenuBar = new JMenuBar();//創建菜單上面的兩個選項的對象 (功能 關于我們)JMenu fuctionJMenu = new JMenu("功能");JMenu aboutJMenu = new JMenu("關于我們");//創建選項下面的條目對象JMenuItem replayItem = new JMenuItem("重新游戲");JMenuItem reloginItem = new JMenuItem("重新登錄");JMenuItem closeItem = new JMenuItem("關閉游戲");JMenuItem accountItem = new JMenuItem("公眾號");//將每一個選項下的條目添加到對應的選項中fuctionJMenu.add(replayItem);fuctionJMenu.add(reloginItem);fuctionJMenu.add(closeItem);aboutJMenu.add(accountItem);//將菜單里面的兩個選項添加到菜單中jMenuBar.add(fuctionJMenu);jMenuBar.add(aboutJMenu);//給整個界面設置菜單this.setJMenuBar(jMenuBar);}private void initJFrame() {//設置界面的寬高this.setSize(603,680);//單位是像素//設置界面的標題this.setTitle("拼圖單機版 v1.0");//設置界面置頂this.setAlwaysOnTop(true);//設置界面居中this.setLocationRelativeTo(null);//設置關閉模式this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//取消默認的居中位置,只有取消了才會按照XY軸的形式添加組件this.setLayout(null);}}
App 測試
import ui.GameJFrame;
import ui.RegisterJFrame;
import ui.loginJFrame;public class App {public static void main(String[] args) {//表示程序的啟動入口//如果我們想要開啟一個界面,就創建誰的對象就好了new GameJFrame();
// new RegisterJFrame();
// new loginJFrame();}
}
現在就每次運行的結果都不一樣了
6、事件
1、動作監聽
創建myjFrame 界面
package test;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;public class myjFrame extends JFrame implements ActionListener {//創建第一個按鈕對象JButton jbt1 = new JButton("點我啊");//創建第二個按鈕對象JButton jbt2 = new JButton("再點我啊");public myjFrame() {JFrame jFrame = new JFrame();//設置界面的寬高jFrame.setSize(603,680);//設置界面的標題jFrame.setTitle("事件演示");//設置界面置頂jFrame.setAlwaysOnTop(true);//設置界面居中jFrame.setLocationRelativeTo(null);//設置關閉模式jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//取消默認居中模式,只有取消了,才可以按照xy軸的形式添加組件jFrame.setLayout(null);//設置位置和寬高jbt1.setBounds(0,0,100,50);jbt1.addActionListener(this);//設置位置和寬高jbt2.setBounds(0,0,100,50);jbt2.addActionListener(this);//把按鈕添加到界面this.getContentPane().add(jbt1);this.getContentPane().add(jbt2);this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e) {//對當前的按鈕進行判斷//獲取當前被操作的哪個按鈕對象Object source = e.getSource();if (source == jbt1) {jbt1.setSize(200,200);}else if (source == jbt2) {Random r = new Random();jbt2.setLocation(r.nextInt(500),r.nextInt(500));}}
}
測試類:test4
package test;public class test4 {public static void main(String[] args) {new myjFrame();}
}
2、鼠標監聽機制
創建myjFrame2 界面
package test;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;public class myjFrame2 extends JFrame implements MouseListener {//創建一個按鈕對象JButton jtb1 = new JButton("點我啊");public myjFrame2(){//設置界面的寬高this.setSize(603, 680);//設置界面的標題this.setTitle("拼圖單機版 v1.0");//設置界面置頂this.setAlwaysOnTop(true);//設置界面居中this.setLocationRelativeTo(null);//設置關閉模式this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//取消默認的居中放置,只有取消了才會按照XY軸的形式添加組件this.setLayout(null);//給按鈕設置位置和寬高jtb1.setBounds(0,0,100,50);//給按鈕綁定鼠標事件jtb1.addMouseListener(this);//那按鈕添加到整個界面當中this.getContentPane().add(jtb1);//讓整個界面顯示出來this.setVisible(true);}@Overridepublic void mouseClicked(MouseEvent e) {System.out.println("單擊");}@Overridepublic void mousePressed(MouseEvent e) {System.out.println("按下不松");}@Overridepublic void mouseReleased(MouseEvent e) {System.out.println("松開");}@Overridepublic void mouseEntered(MouseEvent e) {System.out.println("劃入");}@Overridepublic void mouseExited(MouseEvent e) {System.out.println("劃出");}
}
測試:test4
package test;public class test4 {public static void main(String[] args) {new myjFrame2();}
}
3、鍵盤監聽
創建界面myjFrame3
package test;import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;public class myjFrame3 extends JFrame implements KeyListener {public myjFrame3(){//設置界面的寬高this.setSize(603, 680);//設置界面的標題this.setTitle("拼圖單機版 v1.0");//設置界面置頂this.setAlwaysOnTop(true);//設置界面居中this.setLocationRelativeTo(null);//設置關閉模式this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//取消默認的居中放置,只有取消了才會按照XY軸的形式添加組件this.setLayout(null);//給整個窗體添加鍵盤監聽this.addKeyListener(this);//讓界面顯示出來this.setVisible(true);}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {System.out.println("按下不松");}@Overridepublic void keyReleased(KeyEvent e) {System.out.println("松開按鍵");//獲取鍵盤上每一個按鍵的編號int code = e.getKeyCode();System.out.println(code);}
}
測試:test4
package test;public class test4 {public static void main(String[] args) {new myjFrame3();}
}