1

(数時間後に 2 番目の質問)

ケイ、私は Java でチェスのバリエーションを作成しています。コンソール プログラムを希望どおりに動作させていますが、コンソールをそのまま維持しながら、スイング GUI に変換しようとしています。これまでのところ、コンソール用にピースが入った正方形の配列と、GUI 用にピースが入った JPanel の 2 次元配列があります。私はまだ GUI に可動部分を実装していないので、まだコンソールから実行していますが、実際の G​​UI は部分を移動した後に更新されません...コンソールではそうですが (これがあれば申し訳ありません)紛らわしいです)。

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 メソッドがまったく呼び出されていないようです:(

4

3 に答える 3

2

LayoutManager をリセットしているにもかかわらず、実際には「boardPanel」から何も削除していないようです。

より安全な方法は、コンテナから「boardPanel」を削除してから、「boardPanel」の新しいインスタンスを作成し、それをコンテナに追加してから、他の JPanel ピースをこの新しい「boardPanel」に追加することです。実際には、移動するたびに JPanel 階層全体を再構築することになります。

お気づきのように、Swing は、コンポーネントがコンテナーに追加された後で追加/移動/削除しようとすると、非常に扱いにくくなる可能性があります。ゲームの場合、多くの場合、1 つの JComponent/Component を用意し、Java2D メソッドを使用してその上に描画するのが最善の方法です。通常、Swing はフォームベースのアプリケーションにのみ使用されます。

于 2009-11-13T22:06:01.660 に答える
2

レイアウトを変更しても何も起こりません。

boardPanel.removeChildren() を呼び出す必要があります

ただし、これは非常に遅くなります。

本当にすべきことは、独自の JPanel を用意し、paintComponent() を上書きし、Java Graphics を使用して画像を適切な寸法に描画することです。

于 2009-11-13T22:13:07.063 に答える