2015-05-06 2 views
0

Я создал родословную игру линкоров на Java и включил фрагмент кода ниже. Я получаю пользовательский ввод так же, как использование консоли в GUI. У меня есть JLabel, выступающий в качестве операторов печати, и JTextField, принимающий вход пользователя, а затем JButton для «отправки» ввода.Остановить Java Swing от выполнения без ввода пользователем

Проблема заключается в том, что я создал программу для работы без GUI, и теперь я преобразовываю ее в программу, и я думаю, что прослушиватель действий убегает с собой. Я начал фрагмент кода, в котором пользователь вводит позиции кораблей, они уже выбрали, сколько из каждого типа корабля они хотят. Именно в этот момент, хотя я хотел бы, чтобы пользователь вводил, например, 1 (чтобы выбрать горизонтальный), а затем A4, чтобы начать корабль на A4, после этого программа будет продолжать цикл до тех пор, пока не будет размещено необходимое количество кораблей.

Однако программа вместо этого проскакивает вперед, не заставляя пользователя вводить ориентацию и меняя ярлык на «вводить угадывание» (следующий метод, который снимается на корабле ЦП), и консольные отпечатки «Хотели бы вы, чтобы корабль ? Sub горизонтальная или вертикальная для горизонтального ввести номер 1 или для вертикального ввода № 2: выстрел CPU был: 42 результат выстрела процессора было: пропустить введите догадку» существу пропуск любой входной сигнал от пользователя что касается размещения или ориентации, как я сказал, я думаю, что это может быть связано с прослушивателем действий, хотя я не уверен, в идеале программа будет работать и как только она достигнет любого label1.getText(); программа «приостанавливается» до тех пор, пока у пользователя не будет введенный текст, а затем нажмите кнопку отправки, а затем продолжите работу.

Так что мой вопрос, есть ли способ вставки этого «перерыв» или „пауза“ в код, не меняя всю программу?

for (int i = 0; i < ship.size(); i++) 
     { 
      final int shipNumber = i; 
       while (!worked) 
       { 
        playerLocationToSet.clear(); 
        worked = true; 
        label1.setText("Would you like the ship " + ship.get(shipNumber).getName() + " horizontal(enter 1) or vertical(enter 2) ?"); 
        System.out.println("Would you like the ship " + ship.get(shipNumber).getName() + " horizontal or vertical ?"); 
        System.out.println("For horizontal enter number 1"); 
        System.out.println("Or for vertical enter number 2: "); 
        button1.addActionListener(new ActionListener(){ 
         public void actionPerformed(ActionEvent f){ 
          int addLetter; 
          int addNumber; 
         String orientString = textField1.getText(); 
          int orient = Integer.parseInt(orientString); 
          // horizontal 
        if (orient == 1) 
        { 
         addLetter = 0; 
         addNumber = 1; 
        } 
        // vertical 
        else if (orient == 2) 
        { 
         addLetter = 1; 
         addNumber = 0; 
        } 
          int letterNumber = 0; 
          label1.setText("Where would you like to start " + ship.get(shipNumber).getName() + "?"); 
          String start = textField1.getText(); 
          start = start.toUpperCase(); 
          int letter = start.charAt(0); 
          int number = start.charAt(1) - 48; 
          for (int x = 0; x < alphabet.length; x++) 
          { 
           if(alphabet[x] == letter) 
            { 
             letterNumber = x + 1; 
            } 
          } 
          for (int j = 0; j <ship.get(shipNumber).getSize(); j++) 
          { 
           String position = "" + letterNumber + number; 
           playerLocationToSet.add(position); 
           letterNumber = letterNumber + addLetter; 
           number = number + addNumber; 
           for (int t = 0; t < ship.size(); t++)      } 
        }); 
        ship.get(i).setLocation(playerLocationToSet); 
       } 
     } 
    } 

    private void playerShoot() 
    { 
     String guess; 
     String result; 
     char[] alphabet = {'A', 'B', 'C', 'D', 'E', 'F', 'G'}; 
     char letter; 
     int number; 
     int guessLetter = 0; 
     String finalGuess; 
     while (!CPUship.isEmpty()) 
     { 
      result = "miss"; 
      label1.setText("Enter a guess"); 
      System.out.println("Enter a guess"); 
      guess = textField1.getText(); 
      guess = guess.toUpperCase(); 
      letter = guess.charAt(0); 
      number = guess.charAt(1) - 48; 

Извиняюсь за такой длинный вопрос, я хотел бы попробовать это сделать как можно четче. Не стесняйтесь задавать любые вопросы и сомнения, я пропустил что-то. заранее спасибо

+0

Кодирование графического интерфейса, управляемое событиями, требует совершенно другого подхода к вашей программе, и если ваша консольная программа не выполнена правильно (например, нет подходящих классов, совместимых с ООП), то часто самое лучшее, что нужно сделать, это просто сбрасывать код линейного консольного типа и переписывать его с классом модели, совместимым с ООП, с методами изменения состояния и управляемым событиями графическим интерфейсом, позволяющим взаимодействовать с моделью. –

+0

Не используйте кнопку «Код фрагмента» для обозначения кода. Просто используйте кнопку '{}'. – camickr

+0

Например, цикл 'while (! Работал)' type не будет работать с графическим интерфейсом и не должен быть там. Обратите внимание, что это рискует набирать поток событий Swing, замораживая вашу программу. Я согласен с ответом @ camickr (1+), но по-прежнему рекомендую вам повторить запись. Эти огромные методы должны быть полностью пересмотрены, так как это сделает ваш код более читабельным и отлаживаемым, не только для нас, но и для вас. –

ответ

3

это есть способ вставки этого «перерыв» или „пауза“

Не смотрел код или структуру вашего кода, но в целом вы должны использовать JOptionPane, чтобы запрашивать пользователя для ввода. Это создаст модальный JDialog, который прекратит обработку, пока диалог не будет закрыт.

Для получения дополнительной информации и примеров ознакомьтесь с разделом из учебника Swing по телефону How to Make Dialogs.

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