ActionEvent в Java перемещает несколько кнопок - PullRequest
0 голосов
/ 21 июня 2011

Хорошо, поэтому я довольно много делаю ускоренный курс по созданию java-приложения и у меня возникла проблема с выполнением действия.Программа представляет собой головоломку «15 головоломок», в которой вы скользите по одной фигуре за раз и пытаетесь привести все числа в порядок, поэтому я допускаю опцию режима «Авто», которая решает игровое поле для пользователя после нажатия.Так что мой код читает решение из текстового файла, который работает нормально, но ни один из квадратов (JButtons) не двигается, когда я нажимаю кнопку авто.Поэтому я не уверен, что я просто не понимаю действия или даже процесс полностью или нет.Вот мой код, я могу предоставить больше, если это необходимо.

if (e.getSource() == ctrButtons[0]) {
      System.out.println("Auto Mode started\n");
      Scanner s = null;

      try {
        s = new Scanner(new BufferedReader(new FileReader("move_list.txt")));
        int count = 0;
        while (s.hasNext()) {
          //Cycle through to move in move_list
          if (count != 18) {
            s.next();
            count+=1;
          }
          else {
            int cur_move = Integer.parseInt(s.next());
            count = 0;
            /*Use cur_move to move blank space accordingly
             *UP------------3
             *LEFT----------2
             *RIGHT---------1
             *DOWN----------0
            */
            int zero_index = -1;
            for (int j=0; j<jbnButtons.length; j++) {
              if (Integer.parseInt(jbnButtons[j].getText()) == 0) {
                zero_index = j;
                break;
              }
            }

            Point zero = jbnButtons[zero_index].getLocation();

            //Check if move is up
            if (cur_move == 3) {
              Point next = jbnButtons[zero_index-4].getLocation();
              jbnButtons[zero_index].setLocation(next);
              jbnButtons[zero_index-4].setLocation(zero);
            }
//Check if move is left
                else if (cur_move == 2) {
                  Point next = jbnButtons[zero_index-1].getLocation();
                  jbnButtons[zero_index].setLocation(next);
                  jbnButtons[zero_index-1].setLocation(zero);
                }

            //Check if move is right
            else if (cur_move == 1) {
              Point next = jbnButtons[zero_index+1].getLocation();
              jbnButtons[zero_index].setLocation(next);
              jbnButtons[zero_index+1].setLocation(zero);
            }

            //Check if move is down
            else {
              System.out.println("Current move = 0");
              Point next = jbnButtons[zero_index+4].getLocation();
              jbnButtons[zero_index].setLocation(next);
              jbnButtons[zero_index+4].setLocation(zero);
            }

          }
        }
      }

Таким образом, мой код выполняется, когда я нажимаю кнопку «Авто», и я печатаю вывод на экран, чтобы увидеть, зацикливается ли он черезКод, который был, просто ни одна из кнопок не перемещается каждый раз по циклу.Есть идеи ??

1 Ответ

1 голос
/ 21 июня 2011

Ваш код выполняется в потоке отправки событий.Графический интерфейс не может перерисовать себя до тех пор, пока не завершится выполнение кода, поэтому вы не увидите промежуточных шагов только окончательное расположение каждого компонента.

Считайте раздел tje из учебного пособия по Swing на Параллельность для более полного объяснения.

Возможно, вам следует использовать Swing Timer (в этом руководстве также есть раздел).Каждый раз, когда Таймер срабатывает, вы делаете следующий ход.

...