【问题标题】:Buttons in gameplay not displaying correct message游戏中的按钮未显示正确的消息
【发布时间】:2014-12-17 13:03:05
【问题描述】:

我正在编写一个扫雷游戏。单击按钮时应显示数字 0,1 或 2,以显示相邻的地雷数量。我最近将布局更改为 gridlayout,从那时起,当我单击一个按钮时,我得到的只是“...”,除了发现一个将按钮更改为炸弹 gif 的地雷。

谁能告诉我如何在点击时恢复数字?

这里是创建按钮数组的代码:

    JPanel gridPanel = new JPanel(new GridLayout(boardsize, boardsize));
    buttons = new JButton[boardsize][boardsize];
    mineBoard = new int[9][9];
    for (int a = 0; a < boardsize; a++) 
        for (int b = 0; b < boardsize; b++) {
            buttons[a][b] = new JButton("");
            gridPanel.add(buttons[a][b]);
            buttons[a][b].addMouseListener(new MouseListener(a,b));
            setx(a);
            sety(b);
            settried(false);
            setmine(false);
    }   
    contentPane.add(gridPanel, BorderLayout.CENTER);

当用户点击按钮时:

  // This method takes in an x and y value and defines what should happen when the user clicks there. 
public void click(int row, int col) {
    if(mineBoard[row][col] == Mine) {

        buttons[row][col].setIcon( new ImageIcon( "images/bomb.gif" ) );
        lose();
    } else {
        score += 1;
        updatescore();
        buttons[row][col].setText("" + numAdjMines(mineBoard, row, col));
        mineBoard[row][col] = UncoveredEmpty;
        buttons[row][col].setText(Character.toString(getUserChar(mineBoard[row][col])));
        if(numAdjMines(mineBoard, row, col) == Empty) {
            for(int dr = -1; dr <= 1; dr ++) {
                for(int dc = -1; dc <= 1; dc++) {
                    if(row+dr >= 1 && row+dr < 10 &&
                    col+dc >= 1 && col+dc < 10) {
                        if(mineBoard[row+dr][col+dc] == Empty) {
                            click(row+dr,col+dc);
                        }
                    }
                }
            }
        }
    }
}

MouseLister 类:

 //ACTION WHEN USER CLICKS ON A BUTTON
private class MouseListener extends MouseAdapter {
    private int x = 0;
    private int y = 0;

    public MouseListener(int row, int col) {
        this.x = row;
        int i = 0;
        this.y = col;
    }

    public void mouseClicked(MouseEvent e) {
        if(e.getButton() == MouseEvent.BUTTON1) {
            if((mineBoard[x][y] == Empty) && (Game.this.gamegoing == true)) {
                Game.this.click(x, y);
            } else if(mineBoard[x][y] == Mine) {
                buttons[x][y].setIcon( new ImageIcon( "images/bomb.gif" ) );
                Game.this.lose();

            }} else if(e.getButton() == MouseEvent.BUTTON3) {
            Game.this.buttons[x][y].setText("F");
        }
    }

}

【问题讨论】:

  • 您是否尝试在click 方法的else 中设置断点,看看是否达到了?
  • 我没有尝试过,但是,所有的游戏功能仍然有效,所以看起来如果可以区分数字,它只是没有返回它们。

标签: java arrays swing mouseclick-event


【解决方案1】:

您可以尝试在按钮的默认文本中添加一些空格,如下所示:

buttons[a][b] = new JButton("    ");

或者你可以尝试在按钮上设置文本后打包你的窗口。

【讨论】:

    【解决方案2】:

    当 JButton 只显示点时,意味着没有足够的空间来写下 tekst。

    所以解决方案是告诉Gridlayout 让按钮变大。 我建议你找到一个非常大的窗口来测试你的游戏,然后尝试找到你的窗口足够大的点 GridlayoutJButton 同意可以放置 tekst。

    然后你应该看看你的按钮有多大,然后:

    1. 告诉GridLayout你的按钮应该有多大(通过调用setPrefferedSize()应该可以)
    2. 或者使用其他不会出现此问题的布局管理器。

    附:出现您的炸弹图片是因为图片以不同的方式处理。我相信它们总是显示出来。

    我希望这可以为您解决问题。

    【讨论】:

    • 谢谢,这不是尺寸问题,因为增大它们确实消除了......当我点击一个按钮时它显示'-'而不是 1 或 2。
    • 嗯好吧,这很奇怪,尤其是当你说它之前工作正常时。这是否适用于其他布局管理器?如果是这样,也许切换到其中之一。否则我不知道对不起:(
    • 遗憾的是,我只让它与 GridLayout 一起使用,它也可以在边框布局中的 JPanel 中使用,但数组没有按应有的方式显示,所以我避免了它。
    • 您可以编写自己的 LayoutManager,这并不像看起来那么困难。特别是因为您只需要创建一个网格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    相关资源
    最近更新 更多