【问题标题】:java swing repaint()java摇摆重绘()
【发布时间】:2010-12-16 11:21:00
【问题描述】:

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

好吧,所以我在 java 中制作了一个国际象棋变体,我的控制台程序按我想要的方式工作,但现在我试图将它转换为挥杆 GUI,同时仍然保持控制台的东西完好无损。所以到目前为止,我有一个正方形数组,其中包含用于控制台的片段,还有一个二维数组 JPanel,其中包含用于 GUI 的片段。我还没有在 GUI 中实现移动部件,所以我仍然从控制台执行它,但是在我移动部件后实际的 GUI 没有更新......即使它在控制台上执行(对不起,如果这个令人困惑)。

GUI 由一个构造函数组成,该构造函数调用一些方法 drawBoard() 和 drawSidebar() 并设置大小、标题等......所以这就是 main 方法的样子:

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 方法似乎根本没有调用,即使控制台正在更新:(

【问题讨论】:

    标签: java swing repaint


    【解决方案1】:

    我真的不明白你在做什么。但是每次移动时重新创建整个棋盘面板是没有意义的。所有 Swing 组件只能有一个父组件,更简单的解决方案是将组件从一个面板移动到另一个面板。所以代码会是这样的:

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

    【讨论】:

      【解决方案2】:

      看起来您实际上从未从“boardPanel”中删除任何内容,即使您正在重置其 LayoutManager。

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

      您已经注意到,一旦您在将组件添加到容器后开始尝试添加/移动/删除组件,Swing 就会变得非常挑剔。对于游戏,通常最好的方法是拥有 1 个 JComponent/Component 并使用 Java2D 方法在其上绘制。 Swing 通常只用于基于表单的应用程序。

      【讨论】:

        【解决方案3】:

        改变布局没有任何作用。

        你需要调用 boardPanel.removeChildren()

        但是,这将非常缓慢。

        真的,你应该做的是拥有自己的 JPanel,覆盖 paintComponent() 并使用 Java Graphics 将图像绘制到适当的尺寸。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-29
          • 1970-01-01
          • 2011-09-01
          • 2013-06-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多