0

我正在制作一个国际象棋游戏,我正在使用我用油漆制作的棋盘480x480,并从一些精灵中获取棋子,并将它们中的每一个都制作成60x60透明背景。我设法把棋盘和棋子放在屏幕上,但位置很乱。我正在使用空布局。我做了:

chessBoardLabel.setBounds(0, 0+25, 480, 480);

+25是因为Frame的东西在上面,看起来像是在定位。至于这件作品,例如:

for (int i = 0; i <= 7; i++)
 whitePawnArray[i] = new whitePawnPiece(i*60,420+25); 

参数设置 xPos 和 yPos。对于 bounds 函数,我做了:

whitePawnLabel.setBounds(this.xPos, this.yPos, this.xPos+60, this.yPos+60);

但是会发生这种情况:http://i.imgur.com/MF9Njbi.jpg

如果我这样做:

for (int i = 0; i <= 7; i++)
whitePawnArray[i] = new whitePawnPiece(i*40,280+15);

有时候是这样的:http://i.imgur.com/Pm1fMSp.jpg

第一:定位怎么了?为什么它不符合我的预期?第二:第八件在茫茫荒野中做什么?

package chess.game;
import java.util.*;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class chessMain extends JFrame{
    public static void main (String arguments[]){

    //Create White
    whitePiece white_piece = new whitePiece();

    whitePawnPiece[] whitePawnArray = new whitePawnPiece[8];
    for (int i = 0; i <= 7; i++) whitePawnArray[i] = new whitePawnPiece(i*40,280+15);

    /*whiteTowerPiece[] whiteTowerArray = new whiteTowerPiece[2];
    whiteTowerArray[0] = new whiteTowerPiece(0,420);
    whiteTowerArray[1] = new whiteTowerPiece(420,420);

    whiteHorsePiece[] whiteHorseArray = new whiteHorsePiece[2];
    whiteBishopPiece[] whiteBishopArray = new whiteBishopPiece[2];
    whiteKingPiece whiteKing = new whiteKingPiece();
    whiteQueenPiece whiteQueen = new whiteQueenPiece();*/

    //Create Black

    JFrame frame = new JFrame();
    JPanel panel;

    //Initialize
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setTitle("Chess");
    frame.setSize (640,640);
    frame.setResizable(false);
    frame.setLayout(null);
    panel = new JPanel();
    panel.setLayout(null);
    frame.getContentPane().add(panel);

    //draw chessBoard
    ImageIcon chessBoardIcon = new           ImageIcon(frame.getClass().getResource("/chess/art/Chess_Art/chessBoard.png"));
    JLabel chessBoardLabel = new JLabel(chessBoardIcon);
    panel.add(chessBoardLabel);
    chessBoardLabel.setBounds(0, 0+25, 480, 480);
    frame.setComponentZOrder(chessBoardLabel, 1);
    frame.setComponentZOrder(panel, 2);
    //draw Pawn
    for (int i = 0; i<=7; i++){
        panel.add(whitePawnArray[i].whitePawnLabel);
        whitePawnArray[i].draw();
        frame.setComponentZOrder(whitePawnArray[i].whitePawnLabel, 0);
    }

    frame.setVisible(true);

}
}

public class whitePawnPiece extends whitePiece{
    JLabel whitePawnLabel;
    ImageIcon whitePawnIcon;
    public whitePawnPiece(int x, int y){
        whitePawnIcon = new ImageIcon(getClass().getResource("/chess/art/Chess_Art/white/whitePawnPiece.png"));
        whitePawnLabel = new JLabel (whitePawnIcon);
        //whitePawnLabel.setOpaque(true);
        this.xPos = x;
        this.yPos = y;
        //this.draw();
    }

    @Override
    public void move(int newX, int newY){
        this.xPos = (newX/60)*60;                     //calcular nova pos
        this.yPos = (newY/60)*60;
        this.draw();
    }
    /*public void possibleMoves(){
        selectorMark.drawNew(this.xPos, this.yPos);
        selectorMark.drawNew(this.xPos - 60, this.yPos - 60);
        if (this.yPos == 420)  selectorMark.drawNew(this.xPos - 120, this.yPos - 120);
    }*/

    @Override
    public void draw(){
        //whitePawnIcon.paintIcon(null, chessGUI2.getGraphics(), xPos, xPos);
        whitePawnLabel.setBounds(this.xPos, this.yPos, this.xPos+60, this.yPos+60);     //x, y, width, height
    }

}

public class whitePiece{
    int xPos, yPos;

    public void move(){}
    public void draw(){}

}

第一次把整个代码希望我编辑它是对的呵呵

4

1 回答 1

2
  • 不要为此使用 CardLayout。
  • 我会使用一个使用 GridLayout 的 JPanel 来保存一个 8x8 的国际象棋正方形 JPanel 网格。
  • 我会把它放在 JLayeredPane 中。
  • 我会将我的棋子添加到适当的棋盘 JPanel 中。
  • 移动一块时,我会将其提升到 JLayeredPane 的拖动层。

还:

  • 不要直接在 JFrame 等顶级窗口上绘图。
  • 不要覆盖paint方法。
  • 相反,如果您必须进行绘图,请覆盖paintComponent(Graphics g)JPanel 或 JComponent。
  • 但是同样,如果您使用小型 JPanel 棋盘创建棋盘,则将棋子放在棋盘上并放置好是很容易和自然的。

例如,请在此处查看我的代码。

于 2014-03-14T23:23:09.390 回答