[英]java swing repaint()
( 幾個小時后的第二個問題 )
凱,所以我正在用Java制作國際象棋變體,我的控制台程序正在按我的要求工作,但現在我試圖將其轉換為擺動GUI,同時仍保持控制台狀態不變。 所以到目前為止,我在控制台中擁有正方形陣列,其中包含塊,而在GUI中擁有二維數組JPanels。 我還沒有在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]);
}
}
}
即使正在更新控制台,repaint和revalidate方法似乎根本沒有調用:(
我不太了解你在做什么 但是每次移動時重新創建整個面板都是沒有意義的。 所有Swing組件只能有一個父對象,更簡單的解決方案是將零件從一個面板移動到另一個面板。 因此,代碼將類似於:
previousPanel.remove( piece );
currentPanel.add( piece );
previousPanel.revalidate();
previousPanel.repaint();
currentPanel.revalidate();
似乎您實際上從未從'boardPanel'中刪除任何內容,即使您要重置其LayoutManager。
一種更安全的方法可能是從其容器中刪除“ boardPanel”,然后為“ boardPanel”創建一個新實例,將其添加到容器中,然后將其他JPanel片段添加到此新的“ boardPanel”中。 有效地,您將在每次移動后重新構建整個JPanel層次結構。
正如您所注意到的,一旦在將組件添加到容器中后開始嘗試添加/移動/刪除組件,Swing可能會非常挑剔。 對於游戲,最好的方法通常是擁有1個JComponent / Component並使用Java2D方法在其上面繪制。 Swing通常僅用於基於表單的應用程序。
更改布局不會執行任何操作。
您需要調用boardPanel.removeChildren()
但是,這將非常慢。
確實,您應該做的是擁有自己的JPanel,覆蓋paintComponent()並使用Java Graphics將圖像繪制為適當的尺寸。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.