簡體   English   中英

Java Swing repaint()

[英]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.

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