2014-12-17 10 views
2

Я кодирую тральщик. Кнопки должны отображать цифры 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"); 
     } 
    } 

} 
+0

Вы пытались установить точку останова внутри 'else' метода' click', чтобы убедиться, что это когда-либо достигнуто? – forgivenson

+0

Я этого не пробовал, однако все функциональные возможности игры все еще работают, поэтому кажется, что если они могут отличать цифры, они просто не возвращают их. – AW90

ответ

1

Вы можете попробовать добавить несколько пробелов до вашего текста по умолчанию кнопки, что-то вроде этого:

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

Или вы можете попробовать упаковать свое окно после того, как вы установите текст на кнопке.

+0

Спасибо, но это не работает. Кнопки просто отображают точки. – AW90

0

Когда JButton выделяет только точки, это означает, что недостаточно места для записи текста.

Таким образом, решение должно было бы сообщить Gridlayout, чтобы увеличить размер кнопок. Я бы посоветовал, что вы найдете тест своей игры с очень большими окнами, а затем попытайтесь найти точку, где ваши окна достаточно велики, чтобы Gridlayout en JButton согласны с тем, что можно разместить текст.

Тогда вы должны увидеть, насколько большой ваши кнопки в этой точке, а затем либо:

  1. Расскажите GridLayout, насколько большой ваши кнопки должны быть (по телефону setPrefferedSize(), который должен работать)
  2. Или использовать другой менеджер компоновки что не дает вам этой проблемы.

P.S. Появляется ваша фотография бомбы, потому что пикуры обрабатываются по-другому. Они всегда отображаются, я верю.

Я надеюсь, что это решает его для вас.

+0

Спасибо, это не вопрос размера, поскольку, делая их больше, он устраняет ... когда я нажимаю кнопку, он отображает «-», а не 1 или 2. – AW90

+0

hmm ok это странно, особенно, когда вы говорили, что все прошло хорошо. Это работает с другими менеджерами макетов? Если это возможно, переключитесь на один из них. Else, я бы не пожалел :( – Roan

+0

У меня есть работа с GridLayout, к сожалению, он работает в JPanel в borderlayout, но массив не отображается так, как должен, поэтому я избегал этого. – AW90

 Смежные вопросы

  • Нет связанных вопросов^_^