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