目前想实现的是鼠标单击落子功能,按钮的功能暂时不考虑,运行的时候出现报错,应该是因为对象数组为空导致了空指针异常,想请教一下应该如何改进.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)
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)
把数组设最大 361不就好了或者用list
把数组设最大 361不就好了或者用list具体在哪里设置,求dalao详解
把数组设最大 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;
}
}
}