目前想实现的是鼠标单击落子功能,按钮的功能暂时不考虑,运行的时候出现报错,应该是因为对象数组为空导致了空指针异常,想请教一下应该如何改进.package gobang;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;public class ChessBoard extends JPanel{
    public static final int MARGIN=15;//边缘
    public static final int SPAN=20;//间距
    public static final int ROWS=18;//在棋盘中的行列号
    public static final int COLS=18;
    Image img;
   
    Chess[] chessList;   //记录下在棋盘上的棋子的数组
   
    int chessCount;//当前棋盘上的棋子数
    boolean isBlack=true;
    //构造方法
    public ChessBoard(){
     img=Toolkit.getDefaultToolkit().getImage("C:/Users/XION/Desktop/PIXIV/p2271359131.jpg");
     this.addMouseListener(new MouseMonitor());
    }
    //绘制棋盘
    public void paintComponent(Graphics g){
     super.paintComponent(g);
     g.drawImage(img, 0, 0, this);
     for(int i=0;i<=ROWS;i++){
     g.drawLine(MARGIN, MARGIN+i*SPAN, MARGIN+COLS*SPAN, MARGIN+i*SPAN);
     }
     for(int i=0;i<=COLS;i++){
     g.drawLine(MARGIN+i*SPAN, MARGIN, MARGIN+i*SPAN,MARGIN+ROWS*SPAN);
     }
     g.fillRect(MARGIN+3*SPAN-2, MARGIN+3*SPAN-2, 5, 5);
     g.fillRect(MARGIN+(COLS/2)*SPAN-2, MARGIN+3*SPAN-2, 5, 5);
     g.fillRect(MARGIN+(COLS-3)*SPAN-2, MARGIN+3*SPAN-2, 5, 5);
     g.fillRect(MARGIN+3*SPAN-2, MARGIN+(ROWS/2)*SPAN-2, 5, 5);
     g.fillRect(MARGIN+(COLS/2)*SPAN-2, MARGIN+(ROWS/2)*SPAN-2, 5, 5);
     g.fillRect(MARGIN+(COLS-3)*SPAN-2, MARGIN+(ROWS/2)*SPAN-2, 5, 5);
     g.fillRect(MARGIN+3*SPAN-2, MARGIN+(ROWS-3)*SPAN-2, 5, 5);
     g.fillRect(MARGIN+(COLS/2)*SPAN-2, MARGIN+(ROWS-3)*SPAN-2, 5, 5);
     g.fillRect(MARGIN+(COLS-3)*SPAN-2, MARGIN+(ROWS-3)*SPAN-2, 5, 5);
     for(int i=0;i<chessCount;i++){
     chessList[i].draw(g);
     if(i==chessCount-1){
     int xPos=chessList[i].getCol()*SPAN+MARGIN;
     int yPos=chessList[i].getRow()*SPAN+MARGIN;
     g.setColor(Color.red);
     g.drawRect(xPos-Chess.DIAMETER/2, yPos-Chess.DIAMETER/2, Chess.DIAMETER, Chess.DIAMETER);
     }
     }
     }
    public Dimension getPreferredSize(){
     return new Dimension(MARGIN*2+SPAN*COLS,MARGIN*2+SPAN*ROWS);
    }
   //   检测当前位置是否已经有棋子
    private boolean hasChess(int col,int row){
     for(int i=0;i<chessCount;i++){
     Chess ch=chessList[i];
     if(ch!=null&&ch.getCol()==col&&ch.getRow()==row)
     return true;
     }
     return false;
    } 
    //内部类
    class MouseMonitor extends MouseAdapter{
     public void mousePressed(MouseEvent e){
     //将鼠标坐标换成网格索引
     int col=(e.getX()-MARGIN+SPAN/2)/SPAN;
     int row=(e.getY()-MARGIN+SPAN/2)/SPAN;
     //不能下棋的情况
     if(col<0||col>COLS||row<0||row>ROWS)
     return;
     if(hasChess(col,row))
     return;
     Chess ch=new Chess(ChessBoard.this,col,row,isBlack?Color.black:Color.white);
     chessList[chessCount++]=ch;
     repaint();
     isBlack=!isBlack;
     }
    }
}
package gobang;
import java.awt.*;
import java.awt.geom.Ellipse2D;public class Chess {
    public static final int DIAMETER=ChessBoard.SPAN-2;
    private int col;
    private int row;
    private Color color;
    ChessBoard cb;
    //构造方法
    public Chess(ChessBoard cb,int col,int row,Color color){
     this.cb=cb;
     this.row=row;
     this.col=col;
     this.color=color;
    }
    public int getCol(){
     return col;
    }
    public int getRow(){
     return row;
    }
    public Color getColor(){
     return color;
    }
    public void draw(Graphics g){
     int xPos=col*cb.SPAN+cb.MARGIN;
     int yPos=row*cb.SPAN+cb.MARGIN;
     Graphics2D g2d=(Graphics2D)g;
     RadialGradientPaint paint=null;
     int x=xPos+DIAMETER/4;
     int y=yPos+DIAMETER/4;
     float[] f={0f,1f};
     Color[] c={Color.WHITE,Color.BLACK};
     if(color==Color.black){
     paint=new RadialGradientPaint(x,y,DIAMETER,f,c);
     }
     else if(color==Color.white){
     paint=new RadialGradientPaint(x,y, DIAMETER*2,f,c);
     }
     g2d.setPaint(paint);
     //使边界均匀
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
     g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION,RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT);
        Ellipse2D e=new Ellipse2D.Float(xPos-DIAMETER/2,yPos-DIAMETER/2,DIAMETER,DIAMETER);
        g2d.fill(e);
    }
}
package gobang;import java.awt.BorderLayout;import javax.swing.*;
public class Five extends JFrame{
private JToolBar toolbar;
private JButton startButton,backButton,exitButton;
//1.2.3 显示棋盘   添加ChessBoard类属性成员
private ChessBoard boardPanel;
//   构造方法
    public Five(){
     super("五子棋");
     toolbar=new JToolBar();
     startButton=new JButton("重新开始");
     backButton=new JButton("悔棋");
     exitButton=new JButton("退出");
     boardPanel=new ChessBoard();
     toolbar.add(startButton);
     toolbar.add(backButton);
     toolbar.add(exitButton);
     this.add(boardPanel,BorderLayout.CENTER);
     this.add(toolbar,BorderLayout.NORTH);
     this.setLocation(200, 200);
     this.pack();
     this.setResizable(false);
     this.setDefaultCloseOperation(EXIT_ON_CLOSE);
     this.setVisible(true);
    
    }
    //主方法
    public static void main(String [] args){
     new Five();
    }
}
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at gobang.ChessBoard$MouseMonitor.mousePressed(ChessBoard.java:76)
at java.awt.Component.processMouseEvent(Component.java:6530)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6298)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4522)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)

解决方案 »

  1.   

    是Event事件没做处理吧。
      

  2.   


    把数组设最大 361不就好了或者用list
      

  3.   


    把数组设最大 361不就好了或者用list具体在哪里设置,求dalao详解
      

  4.   


    把数组设最大 361不就好了或者用list具体在哪里设置,求dalao详解把Chess[] chessList;这句改为Chess[] chessList=new Chess[361];因为数组初始化后不能扩容,如果不设置最大, chessList[chessCount++]=ch;这里会溢出。也可以改为可以扩容的listimport java.awt.*;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import java.util.List;import javax.swing.*;
     
    public class ChessBoard extends JPanel{
        public static final int MARGIN=15;//边缘
        public static final int SPAN=20;//间距
        public static final int ROWS=18;//在棋盘中的行列号
        public static final int COLS=18;
        Image img;
        
    //    Chess[] chessList=new Chess[361];   //记录下在棋盘上的棋子的数组
        List<Chess>  chessList= new ArrayList<Chess>();
        
        int chessCount;//当前棋盘上的棋子数
        boolean isBlack=true;
        //构造方法
        public ChessBoard(){
            img=Toolkit.getDefaultToolkit().getImage("C:/Users/XION/Desktop/PIXIV/p2271359131.jpg");
            this.addMouseListener(new MouseMonitor());
        }
        //绘制棋盘
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.drawImage(img, 0, 0, this);
            for(int i=0;i<=ROWS;i++){
                g.drawLine(MARGIN, MARGIN+i*SPAN, MARGIN+COLS*SPAN, MARGIN+i*SPAN);
            }
            for(int i=0;i<=COLS;i++){
                g.drawLine(MARGIN+i*SPAN, MARGIN, MARGIN+i*SPAN,MARGIN+ROWS*SPAN);
            }
            g.fillRect(MARGIN+3*SPAN-2, MARGIN+3*SPAN-2, 5, 5);
            g.fillRect(MARGIN+(COLS/2)*SPAN-2, MARGIN+3*SPAN-2, 5, 5);
            g.fillRect(MARGIN+(COLS-3)*SPAN-2, MARGIN+3*SPAN-2, 5, 5);
            g.fillRect(MARGIN+3*SPAN-2, MARGIN+(ROWS/2)*SPAN-2, 5, 5);
            g.fillRect(MARGIN+(COLS/2)*SPAN-2, MARGIN+(ROWS/2)*SPAN-2, 5, 5);
            g.fillRect(MARGIN+(COLS-3)*SPAN-2, MARGIN+(ROWS/2)*SPAN-2, 5, 5);
            g.fillRect(MARGIN+3*SPAN-2, MARGIN+(ROWS-3)*SPAN-2, 5, 5);
            g.fillRect(MARGIN+(COLS/2)*SPAN-2, MARGIN+(ROWS-3)*SPAN-2, 5, 5);
            g.fillRect(MARGIN+(COLS-3)*SPAN-2, MARGIN+(ROWS-3)*SPAN-2, 5, 5);
            for(int i=0;i<chessCount;i++){
                chessList.get(i).draw(g);
                if(i==chessCount-1){
                    int xPos= chessList.get(i).getCol()*SPAN+MARGIN;
                    int yPos= chessList.get(i).getRow()*SPAN+MARGIN;
                    g.setColor(Color.red);
                    g.drawRect(xPos-Chess.DIAMETER/2, yPos-Chess.DIAMETER/2, Chess.DIAMETER, Chess.DIAMETER);
                }
            }
            }
        public Dimension getPreferredSize(){
            return new Dimension(MARGIN*2+SPAN*COLS,MARGIN*2+SPAN*ROWS);
        }
       //   检测当前位置是否已经有棋子
        private boolean hasChess(int col,int row){
            for(int i=0;i<chessCount;i++){
                Chess ch= chessList.get(i);
                if(ch!=null&&ch.getCol()==col&&ch.getRow()==row)
                    return true;
            }
            return false;
        } 
        //内部类
        class MouseMonitor extends MouseAdapter{
            public void mousePressed(MouseEvent e){
                //将鼠标坐标换成网格索引
                int col=(e.getX()-MARGIN+SPAN/2)/SPAN;
                int row=(e.getY()-MARGIN+SPAN/2)/SPAN;
                //不能下棋的情况
                if(col<0||col>COLS||row<0||row>ROWS)
                    return;
                if(hasChess(col,row))
                    return;
                Chess ch=new Chess(ChessBoard.this,col,row,isBlack?Color.black:Color.white);
                chessList.add(ch);
                chessCount++;
                repaint();
                isBlack=!isBlack;
                }
        }
    }
      

  5.   

    没有对数组进行初始化,在JAVA中,对创建对象后要先初始化和赋值,再引用。