通过着色JButtons的Tetris GUI。渲染问题

时间:2013-03-20 19:52:02

标签: java swing user-interface jbutton tetris

我正在制作俄罗斯方块游戏,而对于我的GUI,我选择将JButton用作我的tetris棋盘。我建立了一个JButtons网格。我打算遍历从

返回的Tetris网格
newGrid = game.gamePlay(oldGrid);

并根据每个网格元素中的整数为每个JButton着色。返回的俄罗斯方块网格是一个整数数组,每个数字代表一种颜色。截至目前,我没有用户交互,我只是想尝试基本的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循环之前移动revalidate然后注释掉while循环,则GUI输出:

enter image description here

这就是我想要的。但是为了给按钮着色一定的颜色,我需要在网格改变时在while循环中进行重新验证。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

  1. 使用GridLayout(更简单LayoutManager)代替GridBagLayout

  2. 使用Swing Timer代替Runnable#Thread

  3. while (true) {是无限循环

  4. Thread.sleep(1000);可以冻结Swing GUI直到睡眠结束,Thread.sleep无限循环会导致不负责任的应用

  5. 看不到JButton.setBackground(somecolor)

  6. 使用KeyBindings(添加到JButtons container)进行轮换