2012-12-03 18 views
-1

* 注意:*我是新来的。如果你打算低估,请告诉我为什么。Java Swing - 在其他类中创建的画布

我正在写一个使用swing的java国际象棋程序。我能够显示板,初始化块,并将它们存储在二维数组中。但是,我无法弄清楚如何在画布上显示这些作品。我在Piece类的第65行不断收到空指针错误。

* 更新:*我已经包含了一些建议的更改。空指针错误已经清除,但我仍然无法让件显示。我认为我没有把它们正确地指向我在国际象棋课程中创建的画布。

我的程序分为三个类别如下:

类象棋

import java.util.Scanner; 

    import javax.swing.*; 
    //import java.awt.*; 


    public class Chess { 
     public static final int WINDOW_WIDTH=600; 
     public static final int WINDOW_HEIGHT=600; 
     public static final int SQUARE_WIDTH = (WINDOW_WIDTH-10)/8; 
     public static final int SQUARE_HEIGHT = (WINDOW_HEIGHT-40)/8; 

     public static int position[][] = {}; 

     public BoardComponent mycanvas= new BoardComponent(this); 

     public Chess() 
     { 

      JFrame mywindow; 
      mywindow=new JFrame("ChessMaster 2012"); 
      mywindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      mywindow.setSize(WINDOW_WIDTH, WINDOW_HEIGHT); 

      //BoardComponent mycanvas= new BoardComponent(this);  
      mywindow.add(mycanvas); 
      mywindow.setVisible(true);    //window appears here 
     } 

     public static void main(String[] args) { 
      position = new int [8][8]; 

      new Chess(); 
import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferStrategy; 

import javax.swing.ImageIcon; 

public class Piece extends JPanel{ 

    Piece[] mypiece; 

    public ImageIcon piece; 
    int nextID = 0; 
    BoardComponent board; 
    Chess chess; 
    public int locx, locy; 

    public void setCanvas(BoardComponent board) 
    { 
     this.board=board; 
    } 

    public Piece(char color, char Type, int posX, int posY){ 
     // each piece assigned a PK on creation, beginning sequentially from top left 
     // and looping back to the beginning of each row 
     int pieceID = nextID; 
     char pieceColor = color; 
     char pieceType = Type; 

     posX = locx; 
     posY = locy; 

     // P = pawn, K = knight, R = Rook, B = Bishop, Q = Queen, 
     //S = king (can't reuse K, so we use S instead) 
     if (pieceType == 'P'){ 
      new Pawn(pieceColor); 
     } 
     else if (pieceType == 'K'){ 
      new Knight(pieceColor); 
     } 
     else if (pieceType == 'R'){ 
      new Rook(pieceColor); 
     } 
     else if (pieceType == 'B'){ 
      new Bishop(pieceColor); 
     } 
     else if (pieceType == 'Q'){ 
      new Queen(pieceColor); 
     } 
     else if (pieceType == 'S'){ 
      new King(pieceColor); 
     } 
     nextID ++; 
     Chess.position[posX][posY] = pieceID; 
     setCanvas(board); 
     repaint(); 
    } 

    @Override 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     drawPiece(g); 
    } 

    public void drawPiece(Graphics g){ 
     g.drawImage(piece.getImage(),(locx*Chess.SQUARE_WIDTH),(locy*Chess.SQUARE_HEIGHT),null); 

    } 

    public class Pawn{ 

     public Pawn(char color){ 
      if(color == 'w'){ 
       piece = new ImageIcon("src/gfx/wpawn.gif"); 
      } 
      else{ 
       piece = new ImageIcon("src/gfx/bpawn.gif"); 
      } 
     } 
    } 

    public class Knight{ 

     public Knight(char color){ 
      if(color == 'w'){ 
       piece = new ImageIcon("src/gfx/wknight.gif"); 
      } 
      else{ 
       piece = new ImageIcon("src/gfx/bknight.gif"); 
      } 
     } 
    } 

    public class Rook{ 
     public Rook(char color){ 
      if(color == 'w'){ 
       piece = new ImageIcon("src/gfx/wrook.gif"); 
      } 
      else{ 
       piece = new ImageIcon("src/gfx/brook.gif"); 
      } 
     } 
    } 

    public class Bishop{ 
     public Bishop(char color){ 
      if(color == 'w'){ 
       piece = new ImageIcon("src/gfx/wbishop.gif"); 
      } 
      else{ 
       piece = new ImageIcon("src/gfx/bbishop.gif"); 
      } 
     } 
    } 

    public class Queen{ 
     public Queen(char color){ 
      if(color == 'w'){ 
       piece = new ImageIcon("src/gfx/wqueen.gif"); 
      } 
      else{ 
       piece = new ImageIcon("src/gfx/bqueen.gif"); 
      } 
    } 
    } 

    public class King{ 
     public King(char color){ 
      if(color == 'w'){ 
       piece = new ImageIcon("src/gfx/wking.gif"); 
      } 
      else{ 
       piece = new ImageIcon("src/gfx/bking.gif"); 
      } 
     } 
    } 

    } 

类BoardComponent:

import java.awt.*; 
import javax.swing.*; 

//This class draws the board and places the initial pieces 
public class BoardComponent extends JComponent{ 
    Chess chess; 

    public BoardComponent(Chess chessobject) 
    { 
     super(); 
     chess=chessobject; 
    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
    super.paintComponent(g); 
    int rowCount = 0; 
    int highCount = 0; 
    int wideCount = 0; 
    int squareCount = 0; 
    ImageIcon piece; 
    for(rowCount = 0; rowCount<8;rowCount++){ 

     for(int i = 0; i < 8; i++){ 
      if(squareCount%2==1){ 
       g.setColor(Color.ORANGE); 
      } 
      else{ 
       g.setColor(Color.darkGray); 
      } 
      g.fillRect(wideCount,highCount, Chess.SQUARE_WIDTH-5, Chess.SQUARE_HEIGHT-5); 
      squareCount = squareCount + 1; 
      wideCount = wideCount + Chess.SQUARE_WIDTH; 
      g.setColor(Color.RED); 
     } 
     squareCount +=1; 
     wideCount = 0; 
     highCount = highCount + Chess.SQUARE_HEIGHT; 
    } 
    } 
} 

类海贼王:

import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferStrategy; 

import javax.swing.ImageIcon; 

public class Piece extends JPanel{ 

Piece[] mypiece; 

public ImageIcon piece; 
int nextID = 0; 
BoardComponent board; 
Chess chess; 
public int locx, locy; 

public void setCanvas(BoardComponent board) 
{ 
    this.board=board; 
} 

public Piece(char color, char Type, int posX, int posY){ 
    // each piece assigned a PK on creation, beginning sequentially from top left 
    // and looping back to the beginning of each row 
    int pieceID = nextID; 
    char pieceColor = color; 
    char pieceType = Type; 

    posX = locx; 
    posY = locy; 

    // P = pawn, K = knight, R = Rook, B = Bishop, Q = Queen, 
    //S = king (can't reuse K, so we use S instead) 
    if (pieceType == 'P'){ 
     new Pawn(pieceColor); 
    } 
    else if (pieceType == 'K'){ 
     new Knight(pieceColor); 
    } 
    else if (pieceType == 'R'){ 
     new Rook(pieceColor); 
    } 
    else if (pieceType == 'B'){ 
     new Bishop(pieceColor); 
    } 
    else if (pieceType == 'Q'){ 
     new Queen(pieceColor); 
    } 
    else if (pieceType == 'S'){ 
     new King(pieceColor); 
    } 
    nextID ++; 
    Chess.position[posX][posY] = pieceID; 
    setCanvas(board); 
    repaint(); 
} 

@Override 
public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    drawPiece(g); 
} 

public void drawPiece(Graphics g){ 
    g.drawImage(piece.getImage(),(locx*Chess.SQUARE_WIDTH),(locy*Chess.SQUARE_HEIGHT),null); 

} 

public class Pawn{ 

    public Pawn(char color){ 
     if(color == 'w'){ 
      piece = new ImageIcon("src/gfx/wpawn.gif"); 
     } 
     else{ 
      piece = new ImageIcon("src/gfx/bpawn.gif"); 
     } 
    } 
} 

public class Knight{ 

    public Knight(char color){ 
     if(color == 'w'){ 
      piece = new ImageIcon("src/gfx/wknight.gif"); 
     } 
     else{ 
      piece = new ImageIcon("src/gfx/bknight.gif"); 
     } 
    } 
} 

public class Rook{ 
    public Rook(char color){ 
     if(color == 'w'){ 
      piece = new ImageIcon("src/gfx/wrook.gif"); 
     } 
     else{ 
      piece = new ImageIcon("src/gfx/brook.gif"); 
     } 
    } 
} 

public class Bishop{ 
    public Bishop(char color){ 
     if(color == 'w'){ 
      piece = new ImageIcon("src/gfx/wbishop.gif"); 
     } 
     else{ 
      piece = new ImageIcon("src/gfx/bbishop.gif"); 
     } 
    } 
} 

public class Queen{ 
    public Queen(char color){ 
     if(color == 'w'){ 
      piece = new ImageIcon("src/gfx/wqueen.gif"); 
     } 
     else{ 
      piece = new ImageIcon("src/gfx/bqueen.gif"); 
     } 
} 
} 

public class King{ 
    public King(char color){ 
     if(color == 'w'){ 
      piece = new ImageIcon("src/gfx/wking.gif"); 
     } 
     else{ 
      piece = new ImageIcon("src/gfx/bking.gif"); 
     } 
    } 
} 

} 

我相当不错w到java,这真的让我有一个循环。谁能帮忙?

谢谢!

+0

你在哪里得到空指针错误?更加详细一些。 – hesson

+0

课件第65行。它在代码中发表了评论,但我也会编辑帖子。 –

+0

我很难弄清楚第65行是什么。你可以在代码中注释一下吗? – hesson

回答

3
  • 请不要从您的构造函数调用drawPiece()出于什么原因?我认为repaint()可能是你需要的。

  • 不使用getGraphics(),因为它不会被初始化,直到面板被添加和第一次重绘完成,如果我没有错。

  • 也永远不会忘记尊重涂料链,并有super.paintComponent(..)作为您的覆盖面板paintComponent(..)方法的第一个电话。

  • 而是扩展JPanel而不是JComponent

我想你的意思是叫drawPiece()paintComponent(..)在哪个地方,你应该只从paintComponent(..)传递Graphic对象s到drawPiece()像这样:

public class Piece extends JPanel{ 



    public Piece(char color, char Type, int posX, int posY){ 

     // each piece assigned a PK on creation, beginning sequentially from top left 
     // and looping back to the beginning of each row 
     .... 

     // P = pawn, K = knight, R = Rook, B = Bishop, Q = Queen, 
     //S = king (can't reuse K, so we use S instead (from Shah, the historical name)) 
     .... 
      nextID ++; 
      Chess.position[posX][posY] = pieceID; 
      repaint(); 
    } 

    @Override 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     drawPiece(g); 
    } 

    public void drawPiece(Graphics g){ 
     g.drawImage(piece.getImage(),(locx*Chess.SQUARE_WIDTH),(locy*Chess.SQUARE_HEIGHT),null); 
    } 
} 

其他建议:

  • 通过JFrame

包装创建用户界面代码

SwingUtilities.invokeLater(new Runnable(){ 
    @Override 
    public void run() { 
     //create ui here 
    } 
}); 
  • 不要呼叫setSize(...)创建于EDTJFrame和其他Swing组件,而覆盖JPanelgetPreferredSize()并返回其适合组件的适当大小等你可以删除setSize电话JFramepack()JFrame实例在设置可见之前

  • +0

    这很有道理。让我看看它是否有效。谢谢您的帮助。 –

    +1

    @Ein_Bear请记住填写那些缺少'super.paintComponent(g);'为所有其他overidden paintComponent方法,如果它不存在,它本身可能会导致很多麻烦 –

    +1

    +1我需要做的少一点咆哮: D – MadProgrammer

    0

    看起来您的变量board尚未初始化。您需要先致电setCanvas()进行初始化,然后您可以致电drawPiece()