1. 博客有时间就写写,所以一篇可能会拆成很多篇,写完后计划再合在一起。
  2. 首先肯定是要实现连连看的界面。
    1. 先准备连连看要的图片。、
    2. “LianLianKan”就是项目名称。
    3. 当然,如果小白看我的博客想学到什么,我会说还是放弃,因为文字描述会忽视很多细节,而细节决定bug……
    4. 所以,包括以前的和以后的,博文都会是给自己看看或者内行触类旁通的,也就是——笔记。
    5. 我也是今天才明白博文的真正意义吧,所以以后的博文风格会大改……尽量会用自己语言风格来描述以便自己能看懂。
  3. 废话少说,现在的第2步:
    1. 创建数组,一个持久化存储的容器:存储连连看的图片 迷宫寻路
    2. 2.有图像在数组看得到,先秀一下看看,免得一开始代码就错了,后面还写个毛。
    3. 到这一步,主函数基本没什么变化。TableFrame.java
       package com.edp.impl;
      
       import java.awt.FlowLayout;
      
       import javax.swing.JFrame;
      import javax.swing.JTable; /**
      *
      * @author Administrator
      *
      */
      @SuppressWarnings("serial")
      public class TableFrame extends JFrame{
      public static void main(String[] args) {
      new TableFrame().initFrame();
      } private void initFrame() {
      this.setSize(800,600);
      this.setDefaultCloseOperation(3);
      this.setLayout(new FlowLayout());
      //设置窗体不能改变大小
      this.setResizable(false);
      this.setLocationRelativeTo(null); MyTableModel mtm = new MyTableModel();
      JTable table = new JTable(mtm);
      this.add(table);
      this.setVisible(true); }
      }
    4. 说明在代码里面写清楚了 。
       package com.edp.impl;
      
       import java.util.Random;
      
       import javax.swing.event.TableModelListener;
      import javax.swing.table.TableModel; public class MyTableModel implements TableModel {
      //1.创建数组,一个持久化存储的容器:存储连连看的图片 迷宫寻路
      private String[][] saveDB = new String[13][13];
      //2.有图像在数组看得到
      //2_2在存的时候想到图片最好随机
      private Random ran = new Random();//创建随机对象
      //2_1 把图片存到数组
      public MyTableModel() {
      int value;
      for(int i = 0;i<saveDB.length;i++){
      for (int j = 0; j < saveDB[i].length; j++) {
      value = ran.nextInt(13)+1;
      saveDB[i][j] = "image/lianliankanimage/"+value+".jpg";
      }
      }
      } //获取列类型
      public Class<?> getColumnClass(int columnIndex) {
      return String.class;
      }
      //获取总行数
      public int getRowCount() {
      return saveDB.length;
      }
      //获取总列数
      public int getColumnCount() {
      return saveDB[0].length;
      }
      //获取表格列名
      public String getColumnName(int columnIndex) {
      //连连看游戏没必要出现表格列名呀,反正不需要
      //实现列名可以通过switch语句,最适合实现。然后在TableFrame类里面实现
      //不过想要实现得这样(用到JScrollPane):
      // JTable table = new JTable(mtm);
      // //把JTable对象加载到JScrollPane
      // JScrollPane jsp = new JScrollPane(table);
      // this.add(jsp);
      //JScrollPane到底是个什么玩意,请自己去查java API说明书。
      return null;
      }
      //设置单元格数据
      public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
      }
      //获得单元格数据
      public Object getValueAt(int rowIndex, int columnIndex) {
      return 0;
      }
      //单元格是否编辑
      public boolean isCellEditable(int rowIndex, int columnIndex) {
      //连连看游戏肯定不需要对单元格进行修改或删除,游戏逻辑自会处理相关格子内的东西。
      return false;
      }
      public void removeTableModelListener(TableModelListener l) {}
      public void addTableModelListener(TableModelListener l) {}
      }
    5. 运行结果是这样子的
    6. 然后开始插入图片看看。
    7. TableFrame.java
       package com.edp.impl;
      
       import java.awt.FlowLayout;
      
       import javax.swing.JFrame;
      import javax.swing.JTable;
      import javax.swing.table.TableColumnModel; /**
      *
      * @author Administrator
      *
      */
      @SuppressWarnings("serial")
      public class TableFrame extends JFrame{
      public static void main(String[] args) {
      new TableFrame().initFrame();
      } private void initFrame() {
      this.setSize(800,600);
      this.setDefaultCloseOperation(3);
      this.setLayout(new FlowLayout());
      //设置窗体不能改变大小
      this.setResizable(false);
      this.setLocationRelativeTo(null); MyTableModel mtm = new MyTableModel();
      JTable table = new JTable(mtm);
      this.add(table);
      //设置显示样式
      //列宽
      table.setRowHeight(35);
      //获取列模型
      TableColumnModel columnModel = table.getColumnModel();
      for (int i = 0; i < columnModel.getColumnCount(); i++) {
      columnModel.getColumn(i).setPreferredWidth(35);
      }
      //设置行列都不能被选中
      table.setRowSelectionAllowed(false);
      table.setColumnSelectionAllowed(false);
      this.setVisible(true); }
      }
    8. MyTableModel.java
       package com.edp.impl;
      
       import java.util.Random;
      
       import javax.swing.ImageIcon;
      import javax.swing.event.TableModelListener;
      import javax.swing.table.TableModel; public class MyTableModel implements TableModel {
      //1.创建数组,一个持久化存储的容器:存储连连看的图片 迷宫寻路
      private String[][] saveDB = new String[13][13];
      //2.有图像在数组看得到
      //2_2在存的时候想到图片最好随机
      private Random ran = new Random();//创建随机对象
      //2_1 把图片存到数组
      public MyTableModel() {
      int value;
      for(int i = 0;i<saveDB.length;i++){
      for (int j = 0; j < saveDB[i].length; j++) {
      value = ran.nextInt(13)+1;
      saveDB[i][j] = "image/"+value+".jpg";
      }
      }
      } //获取列类型
      public Class<?> getColumnClass(int columnIndex) {
      return javax.swing.ImageIcon.class;
      }
      //获取总行数
      public int getRowCount() {
      return saveDB.length;
      }
      //获取总列数
      public int getColumnCount() {
      //这里考虑一个bug:如果连列数都没有,这行代码就会报出异常
      if(saveDB.length>0){
      return saveDB[0].length;
      }
      return 0;
      }
      //获取表格列名
      public String getColumnName(int columnIndex) {
      //连连看游戏没必要出现表格列名呀,反正不需要
      //实现列名可以通过switch语句,最适合实现。然后在TableFrame类里面实现
      //不过想要实现得这样(用到JScrollPane):
      // JTable table = new JTable(mtm);
      // //把JTable对象加载到JScrollPane
      // JScrollPane jsp = new JScrollPane(table);
      // this.add(jsp);
      //JScrollPane到底是个什么玩意,请自己去查java API说明书。
      return null;
      }
      //设置单元格数据
      public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
      saveDB[rowIndex][columnIndex] = (String)aValue;
      }
      //获得单元格数据
      public Object getValueAt(int rowIndex, int columnIndex) {
      //返回图片
      ImageIcon icon = new ImageIcon(saveDB[rowIndex][columnIndex]);
      return icon; }
      //单元格是否编辑
      public boolean isCellEditable(int rowIndex, int columnIndex) {
      //连连看游戏肯定不需要对单元格进行修改或删除,游戏逻辑自会处理相关格子内的东西。
      return false;
      }
      public void removeTableModelListener(TableModelListener e) {}
      public void addTableModelListener(TableModelListener e) {}
      }
    9. 运行后,什么都出来了。
    10. 接下来是实现连连看游戏的消除。
    11. 消除肯定要用鼠标点呀点的。而实现鼠标操作,肯定是要监控。
    12. 监控插哪呢,肯定要是面板创建完,就监控。
    13. 回顾一下处理连连看消除逻辑(算法实现)

      1. 相同图片能够消除

      2. 在同一行或者同一列无障碍物可消除

      3. 一个拐点可消除

      4. 两个拐点可消除

    14. TableFrame.java
       package com.edp.impl;
      
       import java.awt.FlowLayout;
      
       import javax.swing.JFrame;
      import javax.swing.JTable;
      import javax.swing.table.TableColumnModel; /**
      *
      * @author Administrator
      *
      */
      @SuppressWarnings("serial")
      public class TableFrame extends JFrame{
      public static void main(String[] args) {
      new TableFrame().initFrame();
      } private void initFrame() {
      this.setSize(800,600);
      this.setDefaultCloseOperation(3);
      this.setLayout(new FlowLayout());
      //设置窗体不能改变大小
      this.setResizable(false);
      this.setLocationRelativeTo(null); MyTableModel mtm = new MyTableModel();
      JTable table = new JTable(mtm);
      this.add(table);
      //设置显示样式
      //列宽
      table.setRowHeight(35);
      //获取列模型
      TableColumnModel columnModel = table.getColumnModel();
      for (int i = 0; i < columnModel.getColumnCount(); i++) {
      columnModel.getColumn(i).setPreferredWidth(35);
      }
      //设置行列都不能被选中
      table.setRowSelectionAllowed(false);
      table.setColumnSelectionAllowed(false);
      this.setVisible(true); //添加监听器
      LLKMouseListener llkListener = new LLKMouseListener(mtm);
      table.addMouseListener(llkListener);
      }
      }
    15. MyTableModel.java
       package com.edp.impl;
      
       import java.util.Random;
      
       import javax.swing.ImageIcon;
      import javax.swing.event.TableModelListener;
      import javax.swing.table.TableModel; public class MyTableModel implements TableModel {
      //1.创建数组,一个持久化存储的容器:存储连连看的图片 迷宫寻路
      private String[][] saveDB = new String[13][13];
      //2.有图像在数组看得到
      //2_2在存的时候想到图片最好随机
      private Random ran = new Random();//创建随机对象
      //2_1 把图片存到数组
      //3.消除肯定要用鼠标点呀点的。而实现鼠标操作,肯定是要监控。
      public MyTableModel() {
      int value;
      for(int i = 0;i<saveDB.length;i++){
      for (int j = 0; j < saveDB[i].length; j++) {
      value = ran.nextInt(13)+1;
      saveDB[i][j] = "image/"+value+".jpg";
      }
      }
      } //获取列类型
      public Class<?> getColumnClass(int columnIndex) {
      return javax.swing.ImageIcon.class;
      }
      //获取总行数
      public int getRowCount() {
      return saveDB.length;
      }
      //获取总列数
      public int getColumnCount() {
      //这里考虑一个bug:如果连列数都没有,这行代码就会报出异常
      if(saveDB.length>0){
      return saveDB[0].length;
      }
      return 0;
      }
      //获取表格列名
      public String getColumnName(int columnIndex) {
      //连连看游戏没必要出现表格列名呀,反正不需要
      //实现列名可以通过switch语句,最适合实现。然后在TableFrame类里面实现
      //不过想要实现得这样(用到JScrollPane):
      // JTable table = new JTable(mtm);
      // //把JTable对象加载到JScrollPane
      // JScrollPane jsp = new JScrollPane(table);
      // this.add(jsp);
      //JScrollPane到底是个什么玩意,请自己去查java API说明书。
      return null;
      }
      //设置单元格数据
      public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
      saveDB[rowIndex][columnIndex] = (String)aValue;
      }
      //获得单元格数据
      public Object getValueAt(int rowIndex, int columnIndex) {
      //返回图片
      ImageIcon icon = new ImageIcon(saveDB[rowIndex][columnIndex]);
      return icon; }
      //单元格是否编辑
      public boolean isCellEditable(int rowIndex, int columnIndex) {
      //连连看游戏肯定不需要对单元格进行修改或删除,游戏逻辑自会处理相关格子内的东西。
      return false;
      }
      public void removeTableModelListener(TableModelListener e) {}
      public void addTableModelListener(TableModelListener e) {} public String[][] getSaveDB() {
      return saveDB;
      }
      }

      这一部分和之前没有多大变动,加了一个数组输入输出存储,eclipse自动报错加上去的。(74-76行)

    16. LLKMouseListener.java
       package com.edp.impl;
      
       import java.awt.event.MouseAdapter;
      import java.awt.event.MouseEvent; import javax.swing.JTable; public class LLKMouseListener extends MouseAdapter{
      /**
      1.相同图片能够消除
      2.在同一行或者同一列无障碍物可消除
      3.一个拐点可消除
      4.两个拐点可消除
      */
      public MyTableModel mtm; //1_4.发现消除的是一个,点一个就消掉一个
      //所以需要做下关联, 控制第一次还是第二次点击的操作
      public boolean flag = true;
      public int row1, column1, row2, column2;
      //3.鼠标监控
      public LLKMouseListener(MyTableModel mtm) {
      this.mtm = mtm;
      } public void mousePressed(MouseEvent e) {
      //1.相同图片能够消除
      // 1_1.需要知道自己点击的是表格哪个位置
      // 1_2.得到被选中行被选中列
      JTable table = (JTable) e.getSource(); // 1_3.把指定位置的图片消除:去除路径
      String[][] saveDB = mtm.getSaveDB(); if(flag){
      row1 = table.getSelectedRow();
      column1 = table.getSelectedColumn();
      flag = false;
      }else{
      row2 = table.getSelectedRow();
      column2 = table.getSelectedColumn();
      saveDB[row1][column1] = "";
      saveDB[row2][column2] = "";
      flag = true;
      }
      }
      }

      到这一步已经实现任意两个图形相消除,接下来是——两个相同图形的消除。

    17. LLKMouseListener.java
       package com.edp.impl;
      
       import java.awt.event.MouseAdapter;
      import java.awt.event.MouseEvent; import javax.swing.JTable; public class LLKMouseListener extends MouseAdapter{
      /**
      1.相同图片能够消除
      2.在同一行或者同一列无障碍物可消除
      3.一个拐点可消除
      4.两个拐点可消除
      */
      public MyTableModel mtm; //1_4.发现消除的是一个,点一个就消掉一个
      //所以需要做下关联, 控制第一次还是第二次点击的操作
      public boolean flag = true;
      public int row1, column1, row2, column2;
      //3.鼠标监控
      public LLKMouseListener(MyTableModel mtm) {
      this.mtm = mtm;
      } public void mousePressed(MouseEvent e) {
      //1.相同图片能够消除
      // 1_1.需要知道自己点击的是表格哪个位置
      // 1_2.得到被选中行被选中列
      JTable table = (JTable) e.getSource(); // 1_3.把指定位置的图片消除:去除路径
      String[][] saveDB = mtm.getSaveDB(); if(flag){
      row1 = table.getSelectedRow();
      column1 = table.getSelectedColumn();
      flag = false;
      }else{
      row2 = table.getSelectedRow();
      column2 = table.getSelectedColumn();
      if((row1 != row2 || column1 != column2)){
      if(saveDB[row1][column1].equals(saveDB[row2][column2])){
      if(checkRow(row1,column1,row2,column2)||
      checkColumn(row1,column1,row2,column2)){
      saveDB[row1][column1] = "";
      saveDB[row2][column2] = "";
      }
      }
      }
      flag = true;
      }
      } //同行算法
      public boolean checkRow(int row1, int column1, int row2, int column2) {
      // 1.保证两个位置是同一行
      if (row1 == row2) {
      int minColumn = Math.min(column1, column2);
      int maxColumn = Math.max(column1, column2);
      // 寻找两个位置之间的所有位置是否为空
      for (int i = minColumn + 1; i < maxColumn; i++) {
      if (!"".equals(mtm.getSaveDB()[row1][i])) {
      return false;
      }
      }
      return true;
      }
      return false;
      } //同列算法
      public boolean checkColumn(int row1, int column1, int row2, int column2) {
      // 1.保证两个位置是同一列
      if (column1 == column2) {
      int minRow = Math.min(row1, row2);
      int maxRow = Math.max(row1, row2);
      // 寻找两个位置之间的所有位置是否为空
      for (int i = minRow + 1; i < maxRow; i++) {
      if (!"".equals(mtm.getSaveDB()[column1][i])) {
      return false;
      }
      }
      return true;
      }
      return false; }
      public boolean checkOnePoint(int row1, int column1, int row2, int column2) {
      return false; }
      public boolean checkTwoPoint(int row1, int column1, int row2, int column2) {
      return false;
      } }
    18. 继续增加代码,也就是限制消除的条件(对消除提条件),因为只有鼠标监听类有做修改,所以就只放这个类的代码了。
    19. 这里实现的行和列相同图片可以消除。还剩一个拐点和两个拐点。
    20. 在写出上述代码的时候一直用   "System.out.println();"语句进行反复测试才实现代码,而且在不断增加代码中,这种测试方法会一直用。
    21. 一个拐点的实现需要利用到同行消除判断算法和同列消除判断算法。
      1. 这里主调函数没变就不放上来了。
      2. MyTableModel.java
        package com.edp.impl;
        
        import java.util.Random;
        
        import javax.swing.ImageIcon;
        import javax.swing.event.TableModelListener;
        import javax.swing.table.TableModel; public class MyTableModel implements TableModel {
        //1.创建数组,一个持久化存储的容器:存储连连看的图片 迷宫寻路
        private String[][] saveDB = new String[13][13];
        //2.有图像在数组看得到
        //2_2在存的时候想到图片最好随机
        private Random ran = new Random();//创建随机对象
        //2_1 把图片存到数组
        //3.消除肯定要用鼠标点呀点的。而实现鼠标操作,肯定是要监控。
        public MyTableModel() {
        int value;
        for(int i = 0;i<saveDB.length;i++){
        for (int j = 0; j < saveDB[i].length; j++) {
        value = ran.nextInt(13)+1;
        saveDB[i][j] = "image/"+value+".jpg";
        }
        }
        } //获取列类型
        public Class<?> getColumnClass(int columnIndex) {
        return javax.swing.ImageIcon.class;
        }
        //获取总行数
        public int getRowCount() {
        return saveDB.length;
        }
        //获取总列数
        public int getColumnCount() {
        //这里考虑一个bug:如果连列数都没有,这行代码就会报出异常
        if(saveDB.length>0){
        return saveDB[0].length;
        }
        return 0;
        }
        //获取表格列名
        public String getColumnName(int columnIndex) {
        //连连看游戏没必要出现表格列名呀,反正不需要
        //实现列名可以通过switch语句,最适合实现。然后在TableFrame类里面实现
        //不过想要实现得这样(用到JScrollPane):
        // JTable table = new JTable(mtm);
        // //把JTable对象加载到JScrollPane
        // JScrollPane jsp = new JScrollPane(table);
        // this.add(jsp);
        //JScrollPane到底是个什么玩意,请自己去查java API说明书。
        return null;
        }
        //设置单元格数据
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        saveDB[rowIndex][columnIndex] = (String)aValue;
        }
        //获得单元格数据
        public Object getValueAt(int rowIndex, int columnIndex) {
        //返回图片
        ImageIcon icon = new ImageIcon(saveDB[rowIndex][columnIndex]);
        return icon; }
        //单元格是否编辑
        public boolean isCellEditable(int rowIndex, int columnIndex) {
        //连连看游戏肯定不需要对单元格进行修改或删除,游戏逻辑自会处理相关格子内的东西。
        return false;
        }
        public void removeTableModelListener(TableModelListener e) {}
        public void addTableModelListener(TableModelListener e) {} public String[][] getSaveDB() {
        return saveDB;
        }
        }
      3. LLKMouseListener.java ,该有的说明都在代码里面,思路按标的序号自己看。
        package com.edp.impl;
        
        import java.awt.event.MouseAdapter;
        import java.awt.event.MouseEvent; import javax.swing.JTable; public class LLKMouseListener extends MouseAdapter{
        /**
        * 鼠标键控
        * 1.相同图片能够消除
        * 2.在同一行或者同一列无障碍物可消除
        * 3.一个拐点可消除
        * 4.两个拐点可消除
        *
        */
        public MyTableModel mtm; //1_4.发现消除的是一个,点一个就消掉一个
        //所以需要做下关联, 控制第一次还是第二次点击的操作
        public boolean flag = true;
        public int row1, column1, row2, column2;
        public LLKMouseListener(MyTableModel mtm) {
        this.mtm = mtm;
        } public void mousePressed(MouseEvent e) {
        //1.相同图片能够消除
        // 1_1.需要知道自己点击的是表格哪个位置
        // 1_2.得到被选中行被选中列
        JTable table = (JTable) e.getSource(); // 1_3.把指定位置的图片消除:去除路径
        String[][] saveDB = mtm.getSaveDB(); if(flag){
        row1 = table.getSelectedRow();
        column1 = table.getSelectedColumn();
        flag = false;
        }else{
        row2 = table.getSelectedRow();
        column2 = table.getSelectedColumn();
        if((row1 != row2 || column1 != column2)){
        if(saveDB[row1][column1].equals(saveDB[row2][column2])){
        if(checkRow(row1,column1,row2,column2)
        || checkColumn(row1,column1,row2,column2)
        || checkOnePoint(row1,column1,row2,column2)
        || checkTwoPoint(row1,column1,row2,column2)){
        saveDB[row1][column1] = "";
        saveDB[row2][column2] = "";
        }
        }
        } flag = true;
        }
        } //2_1.同行算法,保证两个位置是同一行
        public boolean checkRow(int row1, int column1, int row2, int column2) { if (row1 == row2) {
        int minColumn = Math.min(column1, column2);
        int maxColumn = Math.max(column1, column2);
        // 寻找两个位置之间的所有位置是否为空
        for (int i = minColumn + 1; i < maxColumn; i++) {
        if (!"".equals(mtm.getSaveDB()[row1][i])) {
        return false;
        }
        }
        return true;
        }
        return false;
        } //2_2.同列算法,保证两个位置是同一列
        public boolean checkColumn(int row1, int column1, int row2, int column2) { if (column1 == column2) {
        int minRow = Math.min(row1, row2);
        int maxRow = Math.max(row1, row2);
        // 寻找两个位置之间的所有位置是否为空
        for (int i = minRow + 1; i < maxRow; i++) {
        if (!"".equals(mtm.getSaveDB()[i][column1])) {
        return false;
        }
        }
        return true;
        }
        return false; } //2_3.一个拐点算法
        public boolean checkOnePoint(int row1, int column1, int row2, int column2) {
        //先寻找拐点坐标(row1,column2),(row2 column1)
        if("".equals(mtm.getSaveDB()[row1][column2])&&
        checkRow(row1, column2, row1, column1)&&
        checkColumn(row1, column2, row2, column2)){
        return true;
        }
        if("".equals(mtm.getSaveDB()[row2][column1])&&
        checkRow(row2, column1, row2, column2)&&
        checkColumn(row2, column1, row1, column1)){
        return true;
        }
        return false;
        } //2_4.两个拐点算法
        public boolean checkTwoPoint(int row1, int column1, int row2, int column2) {
        //2_4_1.向左判断,各方向判断都是无数个“一个拐点”算法集合在一起。
        for(int rowLeft = row1 - 1 ; mtm.getSaveDB()[rowLeft][column1] == "" && rowLeft >= 0 ; rowLeft --){
        if(checkOnePoint(rowLeft,column1,row2,column2)){
        return true;
        }
        }
        //2_4_1.向右判断
        for(int rowRight = row1 + 1; rowRight <= mtm.getSaveDB()[0].length && mtm.getSaveDB()[rowRight][column1] == "" ; rowRight ++){
        if(checkOnePoint(rowRight,column1,row2,column2)){
        return true;
        }
        }
        //2_4_1.向上判断
        for(int columnUp = column1 - 1 ; columnUp >= 0 && mtm.getSaveDB()[row1][columnUp] == ""; columnUp --){
        if(checkOnePoint(row1,columnUp,row2,column2)){
        return true;
        }
        }
        //2_4_1.向下判断
        for(int columnDown = column1 + 1 ; columnDown <= mtm.getSaveDB().length && mtm.getSaveDB()[row1][columnDown] == "" ; columnDown ++){
        if(checkOnePoint(row1,columnDown,row2,column2)){
        return true;
        }
        }
        return false;
        } }
      4. 到这一步基本实现可玩性,但还有两个bug没有解决。
    22. 第一个bug:边缘消除无法实现
    23. 第二个bug:消除图片不是成双出现,而是单个随机出现的。

【代码笔记】Java连连看项目的实现(2)——JTable 、TableModel的使用的更多相关文章

  1. 【代码笔记】Java连连看项目的实现(1)——JTable 、TableModel的使用

    javax.swing.table.TableModel和javax.swing.JTable JTable .TableModel是Java里面画表格的包. TableModel:为Table提供显 ...

  2. Java学习笔记三十:Java小项目之租车系统

    Java小项目之租车系统 一:项目背景介绍: 根据所学知识,编写一个控制台版的“呱呱租车系统” 功能: 1.展示所有可租车辆: 2.选择车型.租车量: 3.展示租车清单,包含:总金额.总载货量以及其车 ...

  3. 项目管理---git----快速使用git笔记(五)------本地项目代码提交到远程仓库---新建项目

    上一篇我们已经知道了怎么从远程仓库获取项目文件代码. 项目管理---git----快速使用git笔记(四)------远程项目代码的首次获取 git还有一种使用场景是 我本来在电脑里就有一个项目,现在 ...

  4. Docker学习笔记五:Docker生成jenkins容器,支持Java Web项目持续集成、持续部署

    一.创建jenkins容器: 1.拉取jeknin镜像 sudo docker pull jenkins 2.创建一个jenkins目录 sudo mkdir /jenkins 3.在jenkins目 ...

  5. Android学习笔记_32_通过WebView实现JS代码与Java代码互相通信

    webview两种实现方法,覆盖onKeyDown()方法 缓存 WebSettings应用注意的几个问题 1.要实现JS代码与Java代码互相通信,需要通过Android的WebView控件,在视图 ...

  6. java web项目由http转换成https遇到的各种坑

    java web项目由http转换成https遇到的各种坑 这篇文章写给自己在经历项目由http转换成https遇到的各种坑所做的一份笔记,留给以后自己看,或者和开发的朋友也刚好遇到和我一样的问题的朋 ...

  7. 使用Spring Boot来加速Java web项目的开发

    我想,现在企业级的Java web项目应该或多或少都会使用到Spring框架的. 回首我们以前使用Spring框架的时候,我们需要首先在(如果你使用Maven的话)pom文件中增加对相关的的依赖(使用 ...

  8. Linux(Centos)之安装tomcat并且部署Java Web项目

    1.准备工作 a.下载tomcat linux的包,地址:http://tomcat.apache.org/download-80.cgi,我们下载的版本是8.0,下载方式如图:          b ...

  9. 【转】Java Web 项目获取运行时路径 classpath

    Java Web 项目获取运行时路径 classpath 假设资源文件放在maven工程的 src/main/resources 资源文件夹下,源码文件放在 src/main/java/下, 那么ja ...

随机推荐

  1. ExtJS 4.2.1学习笔记(一)——MVC架构与布局

    1       ExtJS入门 1.1     支持所有主流浏览器 调试推荐:chrome.Safari.Firefox 1.2     推荐目录结构 - appname (包含所有程序代码,是根目录 ...

  2. pkg-config 切换opencv版本

    查看当前版本 pkg-config --modversion opencv 在~/.bashrc最后添加如下内容: CMAKE_INSTALL_PREFIX=/usr/local/opencv3 ex ...

  3. 在 Domoticz 中添加插座开关

    前言 继上一篇的折腾,将 WiFi 插座刷为 ESPEasy,这次介绍一下在 Domoticz 中启用该插座的方法 步骤 在 Domoticz 控制台,设置 → 硬件中添加 Dummy,名称为&quo ...

  4. EasyUI学习笔记(三)—— message和menubutton的使用

    一.message(消息框) 1.1 alert   <script type="text/javascript"> $(function () { // alert方 ...

  5. href="#" 链接到当前页面

    <a href="#" onclick="window.close()">关闭</a>将href="#"是指联接到当 ...

  6. day--39-MySQL的多表查询

    多表查询一:表的基本介绍 可以参考:https://www.cnblogs.com/cdf-opensource-007/p/6517627.html 建立一个员工表信息表和一个部门表,每个员工都对应 ...

  7. LightOJ - 1032 数位DP

    #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #i ...

  8. [转] JQuery UI Tabs 动态添加页签,并跳转到新页签

    [From] https://blog.csdn.net/zhangfeng2124/article/details/76672403 需求: 1.tabs默认只有一个页签,但是需要点击某按钮,动态添 ...

  9. ndoejs创建多重文件夹

    function mkdir(filepath){ var path=require("path") if(!fs.existsSync(path.dirname(filepath ...

  10. B/S和C/S架构简单理解

    B/S和C/S架构简单理解 B/S结构.C/S结构 B(browser浏览器)-S(server服务器),说简单点就是通过浏览器来请求服务器,实现数据交互.那自然了,C(client客户端软件)-S( ...