-1

*注:*私はここで新しいです。反対票を投じる場合は、その理由を教えてください。

私はswingを使ってJavaチェスプログラムを書いています。ボードを表示し、ピースを初期化して、2次元配列に格納することができます。しかし、キャンバスに作品を表示する方法がわかりません。クラスPieceの65行目でnullポインタエラーが発生し続けます。

*更新:*提案された変更のいくつかを含めました。nullポインターのエラーは解消されましたが、まだピースを表示するのに問題があります。チェスのクラスで作成したキャンバスを正しく指し示していないと思います。

私のプログラムは次のように3つのクラスに分けられます。

クラスチェス

   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");
        }
    }
}

}

私はJavaにかなり慣れていないので、これは本当に私をループに陥らせています。誰か助けてもらえますか?

ありがとう!

4

2 に答える 2

3
  • drawPiece()どのような理由でコンストラクターから呼び出してはいけませんか? 私はrepaint()あなたが必要とするものかもしれないと思います。

  • getGraphics()間違っていなければ、パネルが追加されて最初の再描画が行われるまではまだ初期化されないため、使用しないでください。

  • また、ペイント チェーンを尊重し、パネルsuper.paintComponent(..)のオーバーライドされたメソッドで最初の呼び出しとして使用することも忘れないでください。paintComponent(..)

  • むしろ拡張JPanelし、しないJComponent

次のようにs オブジェクトをfromに渡すだけの場所でdrawPiece()呼び出すつもりだったと思います。paintComponent(..)GraphicdrawPiece()paintComponent(..)

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);
    }
}

その他の提案:

  • UI作成コードJFrame

    SwingUtilities.invokeLater(new Runnable(){
        @Override 
        public void run() {
           //create ui here
        }
    });
    
  • 電話setSize(...)をかけないでくださいJFrame

可視に設定する前に、インスタンスの呼び出しと呼び出しJPanel getPreferredSize()を削除するよりも、コンポーネントなどに適合する適切なサイズをオーバーライドして返すsetSizeJFramepack()JFrame

于 2012-12-03T08:50:14.363 に答える
0

変数boardがまだ初期化されていないようです。最初に呼び出して初期化する必要がありsetCanvas()、次に を呼び出すことができますdrawPiece()

于 2012-12-03T08:51:59.503 に答える