【代碼筆記】Java連連看項目的實現(2)——JTable 、TableModel的使用

来源:http://www.cnblogs.com/xiaofu007/archive/2016/05/01/5446618.html
-Advertisement-
Play Games

回顧一下處理連連看消除邏輯(演算法實現) 相同圖片能夠消除 在同一行或者同一列無障礙物可消除 一個拐點可消除 兩個拐點可消除 這一部分和之前沒有多大變動,加了一個數組輸入輸出存儲,eclipse自動報錯加上去的。(74-76行) 到這一步已經實現任意兩個圖形相消除,接下來是——兩個相同圖形的消除。 ...


  1. 博客有時間就寫寫,所以一篇可能會拆成很多篇,寫完後計劃再合在一起。
  2. 首先肯定是要實現連連看的界面。
    1. 先準備連連看要的圖片。、
    2. “LianLianKan”就是項目名稱。
    3. 當然,如果小白看我的博客想學到什麼,我會說還是放棄,因為文字描述會忽視很多細節,而細節決定bug……
    4. 所以,包括以前的和以後的,博文都會是給自己看看或者內行觸類旁通的,也就是——筆記。
    5. 我也是今天才明白博文的真正意義吧,所以以後的博文風格會大改……儘量會用自己語言風格來描述以便自己能看懂。
  3. 廢話少說,現在的第2步:
    1. 創建數組,一個持久化存儲的容器:存儲連連看的圖片 迷宮尋路
    2. 2.有圖像在數組看得到,先秀一下看看,免得一開始代碼就錯了,後面還寫個毛。
    3. 到這一步,主函數基本沒什麼變化。TableFrame.java
       1 package com.edp.impl;
       2 
       3 
       4 import java.awt.FlowLayout;
       5 
       6 import javax.swing.JFrame;
       7 import javax.swing.JTable;
       8 
       9 /**
      10  * 
      11  * @author Administrator
      12  *
      13  */
      14 @SuppressWarnings("serial")
      15 public class TableFrame extends JFrame{
      16     public static void main(String[] args) {
      17         new TableFrame().initFrame();
      18     }
      19 
      20     private void initFrame() {
      21         this.setSize(800,600);
      22         this.setDefaultCloseOperation(3);
      23         this.setLayout(new FlowLayout());
      24         //設置窗體不能改變大小
      25         this.setResizable(false);
      26         this.setLocationRelativeTo(null);
      27         
      28         MyTableModel mtm = new MyTableModel(); 
      29         JTable table = new JTable(mtm);
      30         this.add(table);
      31         this.setVisible(true);
      32         
      33     }
      34 }

       

    4. 說明在代碼裡面寫清楚了 。
       1 package com.edp.impl;
       2 
       3 import java.util.Random;
       4 
       5 import javax.swing.event.TableModelListener;
       6 import javax.swing.table.TableModel;
       7 
       8 public class MyTableModel implements TableModel {
       9     //1.創建數組,一個持久化存儲的容器:存儲連連看的圖片 迷宮尋路
      10     private String[][] saveDB = new String[13][13];
      11     //2.有圖像在數組看得到
      12     //2_2在存的時候想到圖片最好隨機
      13     private Random ran = new Random();//創建隨機對象
      14     //2_1 把圖片存到數組
      15     public MyTableModel() {
      16         int value;
      17         for(int i = 0;i<saveDB.length;i++){
      18             for (int j = 0; j < saveDB[i].length; j++) {
      19                 value = ran.nextInt(13)+1;
      20                 saveDB[i][j] = "image/lianliankanimage/"+value+".jpg";
      21             }
      22         }
      23     }
      24     
      25     //獲取列類型
      26     public Class<?> getColumnClass(int columnIndex) {
      27         return String.class;
      28     }
      29     //獲取總行數
      30     public int getRowCount() {
      31         return saveDB.length;
      32     }
      33     //獲取總列數
      34     public int getColumnCount() {
      35         return saveDB[0].length;
      36     }
      37     //獲取表格列名
      38     public String getColumnName(int columnIndex) {
      39         //連連看游戲沒必要出現表格列名呀,反正不需要
      40         //實現列名可以通過switch語句,最適合實現。然後在TableFrame類裡面實現
      41         //不過想要實現得這樣(用到JScrollPane):
      42         //    JTable table = new JTable(mtm);
      43         //    //把JTable對象載入到JScrollPane
      44         //      JScrollPane jsp = new JScrollPane(table);
      45         //    this.add(jsp);
      46         //JScrollPane到底是個什麼玩意,請自己去查java API說明書。
      47         return null;
      48     }
      49     //設置單元格數據
      50     public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
      51     }
      52     //獲得單元格數據
      53     public Object getValueAt(int rowIndex, int columnIndex) {
      54         return 0;
      55     }
      56     //單元格是否編輯
      57     public boolean isCellEditable(int rowIndex, int columnIndex) {
      58         //連連看游戲肯定不需要對單元格進行修改或刪除,游戲邏輯自會處理相關格子內的東西。
      59         return false;
      60     }
      61     public void removeTableModelListener(TableModelListener l) {}
      62     public void addTableModelListener(TableModelListener l) {}
      63 }

       

    5. 運行結果是這樣子的
    6. 然後開始插入圖片看看。
    7. TableFrame.java
       1 package com.edp.impl;
       2 
       3 
       4 import java.awt.FlowLayout;
       5 
       6 import javax.swing.JFrame;
       7 import javax.swing.JTable;
       8 import javax.swing.table.TableColumnModel;
       9 
      10 /**
      11  * 
      12  * @author Administrator
      13  *
      14  */
      15 @SuppressWarnings("serial")
      16 public class TableFrame extends JFrame{
      17     public static void main(String[] args) {
      18         new TableFrame().initFrame();
      19     }
      20 
      21     private void initFrame() {
      22         this.setSize(800,600);
      23         this.setDefaultCloseOperation(3);
      24         this.setLayout(new FlowLayout());
      25         //設置窗體不能改變大小
      26         this.setResizable(false);
      27         this.setLocationRelativeTo(null);
      28         
      29         MyTableModel mtm = new MyTableModel(); 
      30         JTable table = new JTable(mtm);
      31         this.add(table);
      32         //設置顯示樣式
      33         //列寬
      34         table.setRowHeight(35);
      35         //獲取列模型
      36         TableColumnModel columnModel = table.getColumnModel();
      37         for (int i = 0; i < columnModel.getColumnCount(); i++) {
      38             columnModel.getColumn(i).setPreferredWidth(35);
      39         }
      40         //設置行列都不能被選中
      41         table.setRowSelectionAllowed(false);
      42         table.setColumnSelectionAllowed(false);
      43         this.setVisible(true);
      44         
      45     }
      46 }

       

    8. MyTableModel.java
       1 package com.edp.impl;
       2 
       3 import java.util.Random;
       4 
       5 import javax.swing.ImageIcon;
       6 import javax.swing.event.TableModelListener;
       7 import javax.swing.table.TableModel;
       8 
       9 public class MyTableModel implements TableModel {
      10     //1.創建數組,一個持久化存儲的容器:存儲連連看的圖片 迷宮尋路
      11     private String[][] saveDB = new String[13][13];
      12     //2.有圖像在數組看得到
      13     //2_2在存的時候想到圖片最好隨機
      14     private Random ran = new Random();//創建隨機對象
      15     //2_1 把圖片存到數組
      16     public MyTableModel() {
      17         int value;
      18         for(int i = 0;i<saveDB.length;i++){
      19             for (int j = 0; j < saveDB[i].length; j++) {
      20                 value = ran.nextInt(13)+1;
      21                 saveDB[i][j] = "image/"+value+".jpg";
      22             }
      23         }
      24     }
      25     
      26     //獲取列類型
      27     public Class<?> getColumnClass(int columnIndex) {
      28         return javax.swing.ImageIcon.class;
      29     }
      30     //獲取總行數
      31     public int getRowCount() {
      32         return saveDB.length;
      33     }
      34     //獲取總列數
      35     public int getColumnCount() {
      36         //這裡考慮一個bug:如果連列數都沒有,這行代碼就會報出異常
      37         if(saveDB.length>0){
      38             return saveDB[0].length;
      39         }
      40         return 0;
      41     }
      42     //獲取表格列名
      43     public String getColumnName(int columnIndex) {
      44         //連連看游戲沒必要出現表格列名呀,反正不需要
      45         //實現列名可以通過switch語句,最適合實現。然後在TableFrame類裡面實現
      46         //不過想要實現得這樣(用到JScrollPane):
      47         //    JTable table = new JTable(mtm);
      48         //    //把JTable對象載入到JScrollPane
      49         //      JScrollPane jsp = new JScrollPane(table);
      50         //    this.add(jsp);
      51         //JScrollPane到底是個什麼玩意,請自己去查java API說明書。
      52         return null;
      53     }
      54     //設置單元格數據
      55     public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
      56          saveDB[rowIndex][columnIndex] = (String)aValue;
      57     }
      58     //獲得單元格數據
      59     public Object getValueAt(int rowIndex, int columnIndex) {
      60         //返回圖片
      61         ImageIcon icon = new ImageIcon(saveDB[rowIndex][columnIndex]);
      62         return icon;
      63 
      64     }
      65     //單元格是否編輯
      66     public boolean isCellEditable(int rowIndex, int columnIndex) {
      67         //連連看游戲肯定不需要對單元格進行修改或刪除,游戲邏輯自會處理相關格子內的東西。
      68         return false;
      69     }
      70     public void removeTableModelListener(TableModelListener e) {}
      71     public void addTableModelListener(TableModelListener e) {}
      72 }

       

    9. 運行後,什麼都出來了。
    10. 接下來是實現連連看游戲的消除。
    11. 消除肯定要用滑鼠點呀點的。而實現滑鼠操作,肯定是要監控。
    12. 監控插哪呢,肯定要是面板創建完,就監控。
    13. 回顧一下處理連連看消除邏輯(演算法實現)

      1. 相同圖片能夠消除

      2. 在同一行或者同一列無障礙物可消除

      3. 一個拐點可消除

      4. 兩個拐點可消除

    14. TableFrame.java
       1 package com.edp.impl;
       2 
       3 
       4 import java.awt.FlowLayout;
       5 
       6 import javax.swing.JFrame;
       7 import javax.swing.JTable;
       8 import javax.swing.table.TableColumnModel;
       9 
      10 /**
      11  * 
      12  * @author Administrator
      13  *
      14  */
      15 @SuppressWarnings("serial")
      16 public class TableFrame extends JFrame{
      17     public static void main(String[] args) {
      18         new TableFrame().initFrame();
      19     }
      20 
      21     private void initFrame() {
      22         this.setSize(800,600);
      23         this.setDefaultCloseOperation(3);
      24         this.setLayout(new FlowLayout());
      25         //設置窗體不能改變大小
      26         this.setResizable(false);
      27         this.setLocationRelativeTo(null);
      28         
      29         MyTableModel mtm = new MyTableModel(); 
      30         JTable table = new JTable(mtm);
      31         this.add(table);
      32         //設置顯示樣式
      33         //列寬
      34         table.setRowHeight(35);
      35         //獲取列模型
      36         TableColumnModel columnModel = table.getColumnModel();
      37         for (int i = 0; i < columnModel.getColumnCount(); i++) {
      38             columnModel.getColumn(i).setPreferredWidth(35);
      39         }
      40         //設置行列都不能被選中
      41         table.setRowSelectionAllowed(false);
      42         table.setColumnSelectionAllowed(false);
      43         this.setVisible(true);
      44         
      45         //添加監聽器
      46         LLKMouseListener llkListener = new LLKMouseListener(mtm);
      47         table.addMouseListener(llkListener);
      48     }
      49 }

       

    15. MyTableModel.java
       1 package com.edp.impl;
       2 
       3 import java.util.Random;
       4 
       5 import javax.swing.ImageIcon;
       6 import javax.swing.event.TableModelListener;
       7 import javax.swing.table.TableModel;
       8 
       9 public class MyTableModel implements TableModel {
      10     //1.創建數組,一個持久化存儲的容器:存儲連連看的圖片 迷宮尋路
      11     private String[][] saveDB = new String[13][13];
      12     //2.有圖像在數組看得到
      13     //2_2在存的時候想到圖片最好隨機
      14     private Random ran = new Random();//創建隨機對象
      15     //2_1 把圖片存到數組
      16     //3.消除肯定要用滑鼠點呀點的。而實現滑鼠操作,肯定是要監控。
      17     public MyTableModel() {
      18         int value;
      19         for(int i = 0;i<saveDB.length;i++){
      20             for (int j = 0; j < saveDB[i].length; j++) {
      21                 value = ran.nextInt(13)+1;
      22                 saveDB[i][j] = "image/"+value+".jpg";
      23             }
      24         }
      25     }
      26     
      27     //獲取列類型
      28     public Class<?> getColumnClass(int columnIndex) {
      29         return javax.swing.ImageIcon.class;
      30     }
      31     //獲取總行數
      32     public int getRowCount() {
      33         return saveDB.length;
      34     }
      35     //獲取總列數
      36     public int getColumnCount() {
      37         //這裡考慮一個bug:如果連列數都沒有,這行代碼就會報出異常
      38         if(saveDB.length>0){
      39             return saveDB[0].length;
      40         }
      41         return 0;
      42     }
      43     //獲取表格列名
      44     public String getColumnName(int columnIndex) {
      45         //連連看游戲沒必要出現表格列名呀,反正不需要
      46         //實現列名可以通過switch語句,最適合實現。然後在TableFrame類裡面實現
      47         //不過想要實現得這樣(用到JScrollPane):
      48         //    JTable table = new JTable(mtm);
      49         //    //把JTable對象載入到JScrollPane
      50         //      JScrollPane jsp = new JScrollPane(table);
      51         //    this.add(jsp);
      52         //JScrollPane到底是個什麼玩意,請自己去查java API說明書。
      53         return null;
      54     }
      55     //設置單元格數據
      56     public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
      57          saveDB[rowIndex][columnIndex] = (String)aValue;
      58     }
      59     //獲得單元格數據
      60     public Object getValueAt(int rowIndex, int columnIndex) {
      61         //返回圖片
      62         ImageIcon icon = new ImageIcon(saveDB[rowIndex][columnIndex]);
      63         return icon;
      64 
      65     }
      66     //單元格是否編輯
      67     public boolean isCellEditable(int rowIndex, int columnIndex) {
      68         //連連看游戲肯定不需要對單元格進行修改或刪除,游戲邏輯自會處理相關格子內的東西。
      69         return false;
      70     }
      71     public void removeTableModelListener(TableModelListener e) {}
      72     public void addTableModelListener(TableModelListener e) {}
      73 
      74     public String[][] getSaveDB() {
      75         return saveDB;
      76     }
      77 }

      這一部分和之前沒有多大變動,加了一個數組輸入輸出存儲,eclipse自動報錯加上去的。(74-76行)

    16. LLKMouseListener.java
       1 package com.edp.impl;
       2 
       3 import java.awt.event.MouseAdapter;
       4 import java.awt.event.MouseEvent;
       5 
       6 import javax.swing.JTable;
       7 
       8 public class LLKMouseListener extends MouseAdapter{
       9     /**
      10     1.相同圖片能夠消除
      11     2.在同一行或者同一列無障礙物可消除
      12     3.一個拐點可消除
      13     4.兩個拐點可消除
      14     */
      15     public MyTableModel mtm;
      16     
      17     //1_4.發現消除的是一個,點一個就消掉一個
      18     //所以需要做下關聯, 控制第一次還是第二次點擊的操作
      19     public boolean flag = true;
      20     public int row1, column1, row2, column2;
      21     //3.滑鼠監控
      22     public LLKMouseListener(MyTableModel mtm) {
      23         this.mtm = mtm;
      24     }
      25     
      26     public void mousePressed(MouseEvent e) {
      27         //1.相同圖片能夠消除
      28         // 1_1.需要知道自己點擊的是表格哪個位置
      29         // 1_2.得到被選中行被選中列
      30         JTable table = (JTable) e.getSource();
      31         
      32         // 1_3.把指定位置的圖片消除:去除路徑
      33         String[][] saveDB = mtm.getSaveDB();
      34         
      35         if(flag){
      36             row1 = table.getSelectedRow();
      37             column1 = table.getSelectedColumn();
      38             flag = false;
      39         }else{
      40             row2 = table.getSelectedRow();
      41             column2 = table.getSelectedColumn();
      42             saveDB[row1][column1] = "";
      43             saveDB[row2][column2] = "";
      44             flag = true;
      45         }
      46     }
      47 }

      到這一步已經實現任意兩個圖形相消除,接下來是——兩個相同圖形的消除。

    17. LLKMouseListener.java
       1 package com.edp.impl;
       2 
       3 import java.awt.event.MouseAdapter;
       4 import java.awt.event.MouseEvent;
       5 
       6 import javax.swing.JTable;
       7 
       8 public class LLKMouseListener extends MouseAdapter{
       9     /**
      10     1.相同圖片能夠消除
      11     2.在同一行或者同一列無障礙物可消除
      12     3.一個拐點可消除
      13     4.兩個拐點可消除
      14     */
      15     public MyTableModel mtm;
      16     
      17     //1_4.發現消除的是一個,點一個就消掉一個
      18     //所以需要做下關聯, 控制第一次還是第二次點擊的操作
      19     public boolean flag = true;
      20     public int row1, column1, row2, column2;
      21     //3.滑鼠監控
      22     public LLKMouseListener(MyTableModel mtm) {
      23         this.mtm = mtm;
      24     }
      25     
      26     public void mousePressed(MouseEvent e) {
      27         //1.相同圖片能夠消除
      28         // 1_1.需要知道自己點擊的是表格哪個位置
      29         // 1_2.得到被選中行被選中列
      30         JTable table = (JTable) e.getSource();
      31         
      32         // 1_3.把指定位置的圖片消除:去除路徑
      33         String[][] saveDB = mtm.getSaveDB();
      34         
      35         if(flag){
      36             row1 = table.getSelectedRow();
      37             column1 = table.getSelectedColumn();
      38             flag = false;
      39         }else{
      40             row2 = table.getSelectedRow();
      41             column2 = table.getSelectedColumn();
      42             if((row1 != row2 || column1 != column2)){
      43                 if(saveDB[row1][column1].equals(saveDB[row2][column2])){
      44                     if(checkRow(row1,column1,row2,column2)||
      45                             checkColumn(row1,column1,row2,column2)){
      46                         saveDB[row1][column1] = "";
      47                         saveDB[row2][column2] = "";
      48                     }
      49                 }
      50             }
      51             flag = true;
      52         }
      53     }
      54     
      55     //同行演算法
      56     public boolean checkRow(int row1, int column1, int row2, int column2) {
      57         // 1.保證兩個位置是同一行
      58         if (row1 == row2) {
      59             int minColumn = Math.min(column1, column2);
      60             int maxColumn = Math.max(column1, column2);
      61             // 尋找兩個位置之間的所有位置是否為空
      
                    
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MyBatis和Hibernate一樣都是基於ORM的關係型資料庫框架 ORM工具的基本思想: 1.從配置文件(通常是XML配置文件中)得到 sessionfactory. 2. 由sessionfactory 產生 session 3. 在session中完成對數據的增刪改查和事務提交等. 4. ...
  • Visual studio 2015程式轉Eclipse gun編譯出現的問題總結 1、C++11支持 1)Project settings project右鍵-> c/c++ build ->Settings -> GCC C++ Compiler -> Miscellaneous -> Othe ...
  • 下載oracle javaMail API: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html#javamail-1.4.5-oth-JP ...
  • 描述 Java.lang.Class.forName(String name, boolean initialize, ClassLoader loader) 方法返回與給定字元串名的類或介面的Class對象,使用給定的類載入器。 指定的類載入器載入的類或介面。如果該參數載入器loader 為空,通 ...
  • Composer 是 PHP 的一個依賴管理工具。它允許你申明項目所依賴的代碼庫,它會在你的項目中為你安裝他們。Composer 不是一個包管理器。是的,它涉及 "packages" 和 "libraries",但它在每個項目的基礎上進行管理,在你項目的某個目錄中(例如 vendor)進行安裝。預設... ...
  • 初學java,面對著這個static修飾符,愣是琢磨了兩天時間,還在今天琢磨透了,現在將悟到的東西記錄下來: 1、static修飾符表示靜態修飾符,其所修飾的內容(變數、方法、代碼塊暫時學到這三種)統稱為靜態內容(靜態變數、靜態方法、靜態代碼塊) 2、靜態內容是與類相關的內容。解釋:靜態變數在類載入 ...
  • 1、加入相應依賴包 junit4-4.7.jar 以及spring相關jar包 2、在測試代碼的源碼包中如 src/test/java 新建一個抽象類如下 3、測試 可以看到自動去載入相關的配置文件,最終顯示添加成功 ...
  • autorelease 自動釋放池 autorelease是一種支持引用計數的記憶體管理方式,只要給對象發送一條autorelease消息,會將對象放到一個自動釋放池中,當自動釋放池被銷毀時,會對池子裡面的所有對象做一次release操作 優點:不用再關心對象釋放的時間,不用再關心什麼時候調用rele ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...