java swing重绘()

java swing重绘(),java,swing,repaint,Java,Swing,Repaint,(几个小时后的第二个问题) Kay所以我用java制作了一个国际象棋的变体,我的控制台程序按照我想要的方式工作,但现在我试图将其转换为swing GUI,同时保持控制台的完整性。所以到目前为止,我有一个正方形数组,其中包含用于控制台的片段,还有一个二维JPanel数组,其中包含用于GUI的片段。我还没有在GUI中实现移动块,所以我仍然在控制台中进行,但是在我移动块之后,实际的GUI不会更新…即使它在控制台上进行了更新(如果这让人困惑,请抱歉) GUI由一个构造函数组成,该构造函数调用一些方法dr

(几个小时后的第二个问题)

Kay所以我用java制作了一个国际象棋的变体,我的控制台程序按照我想要的方式工作,但现在我试图将其转换为swing GUI,同时保持控制台的完整性。所以到目前为止,我有一个正方形数组,其中包含用于控制台的片段,还有一个二维JPanel数组,其中包含用于GUI的片段。我还没有在GUI中实现移动块,所以我仍然在控制台中进行,但是在我移动块之后,实际的GUI不会更新…即使它在控制台上进行了更新(如果这让人困惑,请抱歉)

GUI由一个构造函数组成,该构造函数调用一些方法drawBoard()和drawSidebar(),并设置大小、标题等。因此,主方法是这样的:

public static void main(String args[]) {
    ChessGUI GUI = new ChessGUI();
    Board console = new Board();
    do {
        console.printBoard();
        console.getScore();
        console.getMove();
        GUI.boardPanel.revalidate();
        GUI.sidePanel.revalidate();
        GUI.repaint();
    } while (true);
}
和drawBoard()以防发生任何变化:

public void drawBoard() {
    LayoutManager layout = new GridLayout(NUMBER_OF_ROWS, NUMBER_OF_COLS);
    boardPanel.setLayout(layout);
    boardPanel.setPreferredSize(new Dimension(200, 450));
    chessBoard = new JPanel[NUMBER_OF_ROWS][NUMBER_OF_COLS];
    for (int i = 0; i < NUMBER_OF_ROWS; i++) {
        for (int j = 0; j < NUMBER_OF_COLS; j++) {
            chessBoard[i][j] = new JPanel();
            chessBoard[i][j].setBackground(getColor(i,j));
            int index = i * 4 + j;
            if (!(boardArray.chessBoard[index].square.isEmpty())) {
                Piece piece = (Piece) boardArray.chessBoard[index].square.firstElement();
                chessBoard[i][j].add(new JLabel(piece.toString()));
            }
            boardPanel.add(chessBoard[i][j]);
        }
    }
}
public void drawBoard(){
LayoutManager布局=新网格布局(行数、列数);
boardPanel.setLayout(布局);
boardPanel.setPreferredSize(新尺寸(200450));
棋盘=新的JPanel[行数][列数];
for(int i=0;i<行数;i++){
for(int j=0;j<列数;j++){
棋盘[i][j]=新的JPanel();
棋盘[i][j].退步(getColor(i,j));
int指数=i*4+j;
if(!(boardArray.chessBoard[index].square.isEmpty()){
Piece=(Piece)boardArray.chessBoard[index].square.firstElement();
棋盘[i][j]。添加(新JLabel(piece.toString());
}
boardPanel.add(棋盘[i][j]);
}
}
}

重新绘制和重新验证方法似乎根本没有调用,即使控制台正在更新:(

看起来,即使您正在重置“boardPanel”的LayoutManager,您也从未真正从中删除任何内容

更安全的方法可能是从其容器中删除“boardPanel”,然后为“boardPanel”创建一个新实例,将其添加到容器中,然后将其他JPanel片段添加到这个新的“boardPanel”。实际上,在每次移动之后,您都将重建整个JPanel层次结构


正如您所注意到的,在将组件添加到容器中之后,一旦您开始尝试添加/移动/删除组件,Swing可能会非常挑剔。对于游戏来说,最好的方法通常是使用1个JComponent/组件,并使用Java2D方法在其上绘制。Swing通常仅用于基于表单的应用程序。

看起来您是永远不要从“boardPanel”中删除任何内容,即使您正在重置其LayoutManager

更安全的方法可能是从其容器中删除“boardPanel”,然后为“boardPanel”创建一个新实例,将其添加到容器中,然后将其他JPanel片段添加到这个新的“boardPanel”。实际上,在每次移动之后,您都将重建整个JPanel层次结构


正如您所注意到的,在组件添加到容器中之后,如果您开始尝试添加/移动/删除组件,Swing可能会非常挑剔。对于游戏,通常最好的方法是使用1个JComponent/组件,并使用Java2D方法在其上绘制。Swing通常仅用于基于表单的应用程序。

更改布局d我什么也不做

您需要调用boardPanel.removeChildren()

然而,这将是非常缓慢的


实际上,您应该做的是拥有自己的JPanel,覆盖paintComponent(),并使用Java Graphics将图像绘制到适当的维度。

更改布局没有任何作用

您需要调用boardPanel.removeChildren()

然而,这将是非常缓慢的


实际上,您应该做的是拥有自己的JPanel,overwrite paintComponent()并使用Java Graphics将图像绘制成适当的尺寸。

我真的不明白您在做什么。但每次移动时重新创建整个板面板是没有意义的。所有Swing组件只能有一个父组件,更简单的解决方案是将该块从一个面板移动到另一个面板。因此e代码类似于:

previousPanel.remove( piece );
currentPanel.add( piece );
previousPanel.revalidate();
previousPanel.repaint();
currentPanel.revalidate();

我真的不明白你在做什么。但每次移动时都重新创建整个板面板是没有意义的。所有Swing组件只能有一个父组件,更简单的解决方案是只将该块从一个面板移动到另一个面板。因此,代码如下所示:

previousPanel.remove( piece );
currentPanel.add( piece );
previousPanel.revalidate();
previousPanel.repaint();
currentPanel.revalidate();