簡體   English   中英

直到我單擊另一個窗口,Jbutton才會以網格布局組織

[英]Jbuttons won't organize in a grid layout until i click on another window

我正在做一個國際象棋游戲,我在Java上有些新手,如果這是我自己的愚蠢導致的,請原諒我,但是我在設置JFrame時遇到問題,JPanel將顯示捆綁在一起的所有按鈕在左上角,直到我將焦點更改到另一個窗口上,然后返回到象棋游戲,如下所示

(重新對焦之前) 在此處輸入圖片說明

(重新對焦后)

在此處輸入圖片說明

我已經進行了研究,大多數相似的問題與setVisibility(true);之后添加按鈕有關setVisibility(true); 但這似乎不是我的代碼中的問題,下面是我代碼的相關部分(省略象棋邏輯部分),在此先感謝您的幫助/:

這是保存JFrame和main方法的主類

public class Chess extends JFrame
{   
    ChessSquare fromSquare;
    ChessBoard board;
    JPanel panel;
    public Chess(String title)
{
    super(title);
    initialize();
    setVisible(true);
}
public void initialize()
{
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(500, 500);
    board = new ChessBoard();
    add(board.getPanel());

}
private static final long serialVersionUID = -5185475584729272657L;
public static void main(String args[] ) 
{

    Runnable r = new Runnable() {

        @Override
        public void run() {
            Chess chess = new Chess("Chess");
            chess.setVisible(true); 
        }
    };
    SwingUtilities.invokeLater(r);
}

這是保存按鈕/零件和框架的棋盤類

public class ChessBoard
{
JPanel panel;

public ChessPiece fromSquare;
public int fromRank;
public int fromFile;

public ChessPiece toSquare;
public int toRank;
public int toFile;

public ChessPiece enteredSquare;
public int enteredRank;
public int enteredFile;
public Color enteredColor;

boolean makeGray = true;
boolean colorChanged = false;

public ChessPiece [][] squares;
public Queen [] queen;
public King [] king;
public Bishop [][] bishop;
public Knight [][] knight;
public Rook [][] rook;
public Pawn [][] pawn;

public boolean pressed;

public ChessBoard()
{
    panel = new JPanel(new GridLayout(8, 8));
    setPieces();
    setInitColors();
    setIcons();
    for(int i = 0; i<8;i++)
        for(int c = 0; c<8;c++)
        {
            System.out.println(i+", "+c);
            panel.add(squares[i][c]);
        }
    //setMouseActions();
}

}
public JPanel getPanel()
{
    return panel;
}
public void setInitColors()
{
    Insets buttonMargin = new Insets(0,0,0,0);

    boolean flip = true;
    for(int i = 0; i < 8; i++)
        for(int j = 0; j < 8; j++)
    {

        if (flip)
        {
            System.out.println("i: "+i+" c: "+j+squares[i][j]+" WHITE");
            squares[i][j].setMargin(buttonMargin);
            squares[i][j].setOpaque(true);
            squares[i][j].setBorderPainted(false);
            squares[i][j].setBackground(Color.WHITE);
        }    
        else
        {
            System.out.println("i: "+i+" c: "+j+squares[i][j]+" BLACK");
            squares[i][j].setMargin(buttonMargin);
            squares[i][j].setOpaque(true);
            squares[i][j].setBorderPainted(false);
            squares[i][j].setBackground(Color.BLACK);
        }
        System.out.println(flip);
        flip = !flip;
        if (j == 7)
            flip = !flip;
        if ((i > 1) && (i < 6))
            squares[i][j].setOpaque(true);
    }
}
public void setPieces()
{
    squares = new ChessPiece [8][8];
    ImageIcon icon = new ImageIcon(
            new BufferedImage(64, 64, BufferedImage.TYPE_INT_ARGB));
    for(int i = 0; i<8;i++)
        for(int c = 0; c<8;c++)
        {
            squares[i][c] = new ChessPiece(i,c,"empty");
            squares[i][c].setIcon(icon);
        }
    queen = new Queen [2];
    king = new King[2];
    bishop = new Bishop [2][2];
    knight = new Knight [2][2];
    rook = new Rook [2][2];
    pawn = new Pawn [2][8];

    queen [0] = new Queen(true);
    setSquare(queen[0],"blackqueen");
    //====================================      
    queen [1] = new Queen(false);
    setSquare(queen[1],"whitequeen");
    //====================================          
    king [0] = new King(true);
    setSquare(king [0],"blackking");
    //====================================  
    king [1] = new King(false);
    setSquare(king [1],"whiteking");
    //====================================  
    bishop [0][0] = new Bishop(true,0);
    setSquare(bishop[0][0],"blackbishop");
    //====================================  
    bishop [0][3] = new Bishop(true,1);
    setSquare(bishop[0][4],"blackbishop");
    //====================================  
    bishop [1][0] = new Bishop(false,0);
    setSquare(bishop[1][0],"whitebishop");
    //====================================  
    bishop [1][5] = new Bishop(false,1);
    setSquare(bishop[1][6],"whitebishop");
    //====================================  
    knight [0][0] = new Knight(true,0);
    setSquare(knight[0][0],"blackknight");
    //====================================  
    knight [0][7] = new Knight(true,1);
    setSquare(knight[0][8],"blackknight");
    //====================================  
    knight [1][0] = new Knight(false,0);
    setSquare(knight[1][0],"whiteknight");
    //====================================  
    knight [1][9] = new Knight(false,1);
    setSquare(knight[1][10],"whiteknight");
    //====================================  
    rook [0][0] = new Rook(true,0);
    setSquare(rook[0][0],"blackrook");
    //====================================  
    rook [0][11] = new Rook(true,1);
    setSquare(rook[0][12],"blackrook");
    //====================================  
    rook [1][0] = new Rook(false,0);
    setSquare(rook[1][0],"whiterook");
    //====================================  
    rook [1][13] = new Rook(false,1);
    setSquare(rook[1][14],"whiterook");
    //====================================  
    pawn [0][0] = new Pawn(true,1);
    setSquare(pawn[0][0],"blackpawn");
    //====================================
    pawn [0][15] = new Pawn(true,2);
    setSquare(pawn[0][16],"blackpawn");
    //====================================  
    pawn [0][2] = new Pawn(true,3);
    setSquare(pawn[0][2],"blackpawn");
    //====================================  
    pawn [0][3] = new Pawn(true,4);
    setSquare(pawn[0][3],"blackpawn");
    //====================================  
    pawn [0][4] = new Pawn(true,5);
    setSquare(pawn[0][4],"blackpawn");
    //====================================  
    pawn [0][5] = new Pawn(true,6);
    setSquare(pawn[0][5],"blackpawn");
    //====================================  
    pawn [0][6] = new Pawn(true,7);
    setSquare(pawn[0][6],"blackpawn");
    //====================================  
    pawn [0][7] = new Pawn(true,8);
    setSquare(pawn[0][7],"blackpawn");
    //====================================  
    pawn [1][0] = new Pawn(false,1);
    setSquare(pawn[1][0],"whitepawn");
    //====================================  
    pawn [1][17] = new Pawn(false,2);
    setSquare(pawn[1][18],"whitepawn");
    //====================================  
    pawn [1][2] = new Pawn(false,3);
    setSquare(pawn[1][2],"whitepawn");
    //====================================  
    pawn [1][3] = new Pawn(false,4);
    setSquare(pawn[1][3],"whitepawn");
    //====================================  
    pawn [1][4] = new Pawn(false,5);
    setSquare(pawn[1][4],"whitepawn");
    //====================================  
    pawn [1][5] = new Pawn(false,6);
    setSquare(pawn[1][5],"whitepawn");
    //====================================  
    pawn [1][6] = new Pawn(false,7);
    setSquare(pawn[1][6],"whitepawn");
    //====================================  
    pawn [1][7] = new Pawn(false,8);
    setSquare(pawn[1][7],"whitepawn");
    //====================================
}
public void setSquare(ChessPiece piece, String type)
{
    squares[piece.getX()][piece.getY()] = piece;
    System.out.println("Setting "+type+" as squares["+piece.getX()+"]["+piece.getY()+"]");
    piece.setName(type);

在將所有相關組件添加到JFrame之后,應該調用JFramepack()方法(基本上,在執行.setVisible(true)

以防萬一有人想知道,我通過使用本機JButtons而不是我制作的chessSquare(繼承了JButton)類解決了此問題,盡管不確定為什么,但這已經為我解決了。

擴展Jbutton時,您是否實現/覆蓋了getX()和getY()。 如果是這樣,則可能是原因,因為JButton繼承自Component類的這兩個方法是必需的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM