Как выйти из цикла while для JOptionPane, когда пользователь нажимает нет?

Я пытаюсь написать цикл while (не делать...while), который завершается, когда пользователь нажимает "Нет" в окне showConfirmDialog. Однако, когда я запускаю программу, она продолжает повторять цикл, даже если я нажимаю Нет или пытаюсь выйти. Я подозреваю, что это потому, что я не могу получить переменную yesNO равной JOptionPane.NO_ANSWER, даже если она должна превратиться в NO_ANSWER, когда я нажимаю Нет... правильно?

Мой код SecureRandom, хранящийся в переменных rand и number, не генерирует случайные числа в массиве ответов. Я пробовал Math.random(), и он не работал, но я хочу использовать SecureRandom для генерации индекса случайного массива.

Последняя строка моего цикла while не заменяет значение userInput пустой строкой. Она просто перебирает цикл с набранным первым вопросом. Поэтому, даже если я ХОЧУ остаться в этом бесконечном цикле, он даже не записывает новый вопрос, который я набираю...

Как сделать так, чтобы цикл завершался, когда пользователь нажимал "нет", код SecureRandom каждый раз генерировал новый индекс ответа (в настоящее время он показывает только индекс 19 "Очень сомнительно"), а переменная userInput заменяется пустой строкой? или, по крайней мере, заменяет текущую строку входными данными следующей итерации

import javax.swing.*;
import java.math.*;


public class MagicEightBall {


    public static void main(String[] args) {

        Random rand = new SecureRandom();
        int number = rand.nextInt(20);

        //array for answers
        String [] answers = {"It is certain", "It is decidedly so", "Without a doubt",
                "Yes - definitely", "You may rely on it", "As I see it, yes",
                "Most likely", "Outlook good", "Signs point to yes",
               "Yes", "Reply hazy, try again", "Ask again later",
               "Better not tell you now", "Cannot predict now", "Concentrate and ask again",
               "Don't count on it", "My reply is no", "My sources say no",
               "Outlook not so good", "Very doubtful"};

         ImageIcon image = new ImageIcon("8ball_small.jpg");

         // prompt user for question
         String userInput = JOptionPane.showInputDialog(null, "What is your question?", "Welcome to MAGIC 8-BALL", JOptionPane.QUESTION_MESSAGE);

         //return answer (Always returns "Very Doubtful)
         showMessageDialog(userInput + "\n\n\n\n" + answers[number],"MAGIC 8-BALL SAYS: ",0,image);


         int yesNo = showConfirmDialog("","ASK MAGIC 8-BALL AGAIN", JOptionPane.YES_NO_OPTION, 0, image);

         // ask user to stop or continue asking questions (begins loop no
         //matter what input)

         while (yesNo == JOptionPane.YES_OPTION) {

           userInput = JOptionPane.showInputDialog(null, "What is your question?", "Welcome to MAGIC 8-BALL", JOptionPane.QUESTION_MESSAGE);
           showMessageDialog(userInput + "\n\n\n\n" + answers[number],"MAGIC 8-BALL SAYS: ",0,image);
           yesNo = showConfirmDialog("","ASK MAGIC 8-BALL AGAIN", JOptionPane.YES_NO_OPTION, 0, image);
           userInput = ""; // doesn't reset userInput to an empty string for
                           // next iteration
        }

           showMessageDialog("/n/n/n/n Programmed By Jason Silva","GOODBYE ",0,image);


}


//teacher wants us to write methods for the dialog boxes

public static void showMessageDialog(String message, String title, int messageType, ImageIcon image) {

        JOptionPane.showMessageDialog (null, message, title, messageType, image);


    }


public static int showConfirmDialog(String message, String title,
                                    int optionType, int messageType, ImageIcon icon) {

        JOptionPane.showConfirmDialog(null, message, title, optionType, messageType, icon);
        return optionType;

    }



}

2 ответа

Вам не нужны ваши подсказки перед циклом WHILE. Подсказок цикла WHILE будет достаточно, однако вам нужно будет сгенерировать индексный номер случайного ответа в этом цикле WHILE, иначе вы всегда будете давать один и тот же ответ независимо от того, сколько вопросов задано. Я не думаю, что ты хочешь этого.

Вам не нужно очищать переменную userInput (userInput = "";), поскольку она делает все это сама, когда вы повторно объявляете ее в цикле WHILE. Переменная инициализируется тем, что введено в диалоговом окне ввода, и если ничего не указано, то ничего ("") - это то, что будет хранить userInput.

Что со всеми /n в вызове метода showMessageDialog(). Упс... это должно быть \ n 's;)

Все должно выглядеть примерно так:

Random rand = new SecureRandom();

//array for answers
String [] answers = {"It is certain", "It is decidedly so", "Without a doubt",
        "Yes - definitely", "You may rely on it", "As I see it, yes",
        "Most likely", "Outlook good", "Signs point to yes",
        "Yes", "Reply hazy, try again", "Ask again later",
        "Better not tell you now", "Cannot predict now", "Concentrate and ask again",
        "Don't count on it", "My reply is no", "My sources say no",
        "Outlook not so good", "Very doubtful"};

ImageIcon image = new ImageIcon("8ball_small.jpg");

int yesNo = -1;
while (yesNo != JOptionPane.NO_OPTION) {
    int number = rand.nextInt(20);
    String userInput = JOptionPane.showInputDialog(null, "What is your question?", 
                       "Welcome to MAGIC 8-BALL", JOptionPane.QUESTION_MESSAGE);

    showMessageDialog(userInput + "\n\n\n\n" + answers[number],"MAGIC 8-BALL SAYS: ",0,image);

    yesNo = showConfirmDialog("","ASK MAGIC 8-BALL AGAIN", JOptionPane.YES_NO_OPTION, 0, image);
}

showMessageDialog("\n\n\n\n Programmed By Jason Silva","GOODBYE ",0,image);

Ваш showConfirmDialog метод всегда возвращает optionType который всегда JOptionPane.YES_NO_OPTION, Он игнорирует ввод пользователя.

Ты звонишь rand.nextInt() ровно один раз, что означает, что вы всегда будете иметь одинаковое значение. Переместить звонок на rand.nextInt() в ваш цикл while, если вы хотите каждый раз новое случайное число.

Другие вопросы по тегам