2013-05-19 3 views
1

У меня есть две кнопки прослушивания для игрового поля с использованием java swing.Java Swing Button Слушатели не работают

Сначала создается сетка тетриса, а затем добавляется функциональность в каждом прослушивателе кнопок.

Я поставил доску вверх, как это в моем Play.java:

final TetrisGame g = new TetrisGame(11,1); 
final BoardGraphics graphics = new BoardGraphics(TetrisBoard.BOARD_WIDTH, 40, g); 

Кнопка слушателей затем создается в том же Play.java:

graphics.btnStart.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       Action arc = p.getAction(g); 
       g.update(arc); 
       graphics.colours.clear(); 
       graphics.setColor(g.getBoard().getGrid()); 
       while (arc instanceof Store){ 
        arc = p.getAction(g); 
        g.update(arc); 
        graphics.colours.clear(); 
        graphics.setColor(g.getBoard().getGrid()); 
       } 

      graphics.tiles.redraw(); 
      System.out.println(); 
      System.out.println(g.toString()); 
      System.out.println(); 
      } 

     }); 


     graphics.btnAuto.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 

       while (!g.gameEnded()){ 
        Action arc = p.getAction(g); 
        g.update(arc); 
        graphics.colours.clear(); 
        graphics.setColor(g.getBoard().getGrid()); 
        while (arc instanceof Store){ 
         arc = p.getAction(g); 
         g.update(arc); 
         //graphics.colours.clear(); 
         graphics.setColor(g.getBoard().getGrid()); 
        } 
        graphics.tiles.redraw(); 
        System.out.println(); 
        System.out.println(g.toString()); 
        System.out.println(); 
        /*try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       }*/ 

       } 

      } 

     }); 

btnStart прекрасно работает, нажав это когда-то, рисуя тетрасбор в соответствии со следующим шагом, данным агентом AI.

Я хотел бы, чтобы btnAuto воспроизводил каждый ход без нажатия кнопки btnStart для генерации движения до конца. Тем не менее, мой btnAuto не рисует ничего на сетке, а конечное состояние игры, состояние финиша.

Может ли кто-нибудь понять, почему это может быть не перекрашивание сетки после каждого движения, генерируемого в цикле while?

ответ

3

Ваш цикл, пока вызывается на потоке Качели событий и, таким образом, предотвращая поток от выполнения своих необходимых действий, включая предоставление графического интерфейса и взаимодействия с пользователем:

while (!g.gameEnded()){ 
    Action arc = p.getAction(g); 

    // .... 

} 

Я хотел бы использовать Swing Timer здесь вместо цикла while (true). Другой вариант - использовать фоновый поток, но поскольку все, что вам нужно, это очень простой игровой цикл и не нужно запускать какой-то длительный фоновый режим, я думаю, что этот второй вариант будет более сложным без каких-либо дополнительных преимуществ.

Как в стороне, мне любопытно, как вы делаете свой рисунок и как вы получаете объект Graphics для рисования. Вы не звоните getGraphics() на компонент, не так ли?


Редактировать вы заявляете в комментарии:

я в настоящее время есть класс с вложенным классом, который расширяет JPanel. Рисунок сетки и GetGraphics() осуществляется в пределах вложенного class.The родительского класса создает компонент и задает расположение GUI в целом

Не получить объект Graphics, вызвав getGraphics() на Компонент GUI как полученный объект Graphics не будет сохраняться. Чтобы убедиться, что это так, просто скройте, а затем восстановите приложение и расскажите, что происходит с графикой после этого. Вы должны сделать весь свой чертеж в переопределении paintComponent JPanel. Один из вариантов - вызвать getGraphics() на BufferedImage и использовать его для рисования в BufferedImage, а затем отобразить BufferedImage в переопределении paintComponent. Если вы используете второй метод, не забудьте утилизировать объект Graphics BufferedImage после того, как вы закончите его использование, чтобы не загружать системные ресурсы.

+0

Это сработало отлично .. и также решает мою проблему использования таймера внутри цикла while, не помещая мое приложение в режим сна. –

+0

@DizzyChamp: рад, что это помогло! –

+0

В настоящее время у меня есть класс с вложенным классом, который расширяет JPanel. Рисунок сетки и getGraphics() выполняется внутри вложенного класса.Родительский класс создает компонент и устанавливает макет GUI в целом. –

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