1

私は Tetris ゲームを作成しています。私の GUI では、テトリス ボードとして使用する JButton に色を付けることにしました。JButton のグリッドをセットアップしました。から返される Tetris グリッドをループする予定です。

newGrid = game.gamePlay(oldGrid);

各グリッド要素の整数に基づいて各 JButton に色を付けます。返される Tetris グリッドは整数の配列で、各数値は色を表します。今のところ、ユーザーとのやり取りはありません。ブロックがまっすぐ下に落ちる基本的な GUI を作ろうとしています。

final JPanel card3 = new JPanel();
// Tetris setup
JButton startGame = new JButton("START GAME");
card3.setLayout(new GridBagLayout());
GridBagConstraints gbc2 = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(2, 2, 2, 2);
card3.add(startGame, gbc2);
gbc.gridy = 1;
startGame.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    card3.remove(0); //remove start button

    Game game = new Game();
    int[][] oldGrid = null;
    int[][] newGrid = null;
    boolean firstTime = true;

    JButton[][] grid; // tetris grid of buttons
    card3.setLayout(new GridLayout(20, 10));
    grid = new JButton[20][10];
    for (int i = 0; i < 20; i++) {
        for (int j = 0; j < 10; j++) {
            grid[i][j] = new JButton();
            card3.add(grid[i][j]);
        }
    }               

    while (true) {
            if (firstTime) {
                newGrid = game.gamePlay(null);
            } else {
                newGrid = game.gamePlay(oldGrid);
            }

            //Coloring Buttons based on grid

            oldGrid = newGrid;
            firstTime = false;
            card3.revalidate();
        }
    }
});

そして、ここに Game クラスのコードがあります

public class Game
{
    static Tetris game;

    public int[][] gamePlay(int[][] grid) {
        if (grid == null) {
            game = new Tetris();
            System.out.println("first time");
        }
        else {
                game.setGrid(grid);
            }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        game.move_Down();
        game.print_Game();

        return game.getGrid();
    }
}

game.print_Game(); グリッドをコンソール ウィンドウに出力して、何が起こっているかをテキストで確認できるようにします。しかし、 card3.revalidate(); 印刷が開始されると GUI が停止するため、動作していないようです。while ループの前に再検証を移動し、while ループをコメント アウトすると、GUI は次のように出力します。

ここに画像の説明を入力

それが私が欲しいものです。しかし、ボタンを特定の色にするには、グリッドが変化するときに while ループで再検証を行う必要があります。

助言がありますか?

4

1 に答える 1

3
  1. の代わりにGridLayout(単純な) を使用LayoutManagerGridBagLayout

  2. Swing Timerの代わりに使用Runnable#Thread

  3. while (true) {は無限ループです

  4. Thread.sleep(1000);スリープが終了するまで Swing GUI をフリーズさせることがThread.sleepでき、無責任なアプリケーションを引き起こす可能性がある無限ループ

  5. そこが見えないJButton.setBackground(somecolor)

  6. JButtons containerローテーションに KeyBindings を使用 ( to に追加)

于 2013-03-20T20:00:09.340 に答える