Как добавить функциональность к кнопке выхода без System.exit (0)? - PullRequest
1 голос
/ 21 августа 2011

Я прошел и имел программу System.exit (0) всякий раз, когда пользователь нажимал красную кнопку выхода окна. Есть ли более эффективный способ добавить функциональность этой кнопке?

import javax.swing.JOptionPane;
import java.util.Scanner;

class codeWithProblem
{
    public static void main (String[] args)
    {
        String name, gender, passions, enjoy;
        int yesNo, permission, endProgram;
        String prefix = "";
        while (true)
        {
            name = JOptionPane.showInputDialog("Please enter your name: ");
            if (name.equals("null"))
            {
                System.exit(0);
            }
            yesNo = JOptionPane.showConfirmDialog(null, "So your name is           "+name+". Is this correct?", "", JOptionPane.YES_NO_OPTION);
            if (yesNo == -1)
            {
                System.exit(0);
            }
            if (yesNo == 0)
            {
                break;
            }
        }
        while (true)
        {
            gender = JOptionPane.showInputDialog("Are you a boy or a girl?: ");
            if (gender.equals("null"))
            {
                System.exit(0);
            }
            if ("boy".equalsIgnoreCase(gender)||"girl".equalsIgnoreCase(gender))
            {
                break;
            }
        }
        if ("boy".equalsIgnoreCase(gender))
        {
            prefix = "Mr. ";
        }
        if ("girl".equalsIgnoreCase(gender))
        {
            prefix = "Ms. ";
        }
        JOptionPane.showMessageDialog(null, "It's nice to meet you "+prefix+name+".", "Hello", JOptionPane.PLAIN_MESSAGE);
        permission = JOptionPane.showConfirmDialog(null, "Lets ask some easy questions to start out with. Is this okay with you?: ",
        "", JOptionPane.YES_NO_OPTION);
        if (permission == 1)
        {
            endProgram = JOptionPane.showConfirmDialog(null, "Do you want to end this program? Click CANCEL to end and OKAY to continue.",
            "End Program?", JOptionPane.OK_CANCEL_OPTION);
            if (endProgram == 0)
            {
                JOptionPane.showMessageDialog(null, "Good, lets continue...", "Continue", JOptionPane.PLAIN_MESSAGE);
                permission = 0;
            }
            if (endProgram == 1)
            {
                JOptionPane.showMessageDialog(null, "Goodbye....", "END", JOptionPane.PLAIN_MESSAGE);
            }
        }
        if (permission == 0)
        {
            passions = JOptionPane.showInputDialog("What are some of your passions?: ");
            if (passions.equals("null"))
            {
                System.exit(0);
            }
            enjoy = JOptionPane.showInputDialog("Why do you enjoy "+passions+"?: ");
            if (enjoy.equals("null"))
            {
                System.exit(0);
            }
            JOptionPane.showMessageDialog(null, "That's interesting", "hmmm", JOptionPane.PLAIN_MESSAGE);
            JOptionPane.showMessageDialog(null, "This program has no point and is going to end now.", "BACON", JOptionPane.PLAIN_MESSAGE);
        }
    }
}

Ответы [ 3 ]

4 голосов
/ 21 августа 2011

О какой красной кнопке вы говорите?

Этот?

enter image description here

Если так, то вы можете реализовать WindowListener для вашего JFrame:

JFrame f = ...;
f.addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent we) {
      System.exit(0);
   }
});

Или вы можете просто установить операцию закрытия по умолчанию:

JFrame f = ...;
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
1 голос
/ 21 августа 2011

Ваш код не будет работать даже с тем, что вы сделали.

Когда пользователь нажимает кнопку enter image description here, значение поля ввода from будет нулевым.

name = JOptionPane.showInputDialog("Please enter your name: ");

Если пользователь закрывает диалоговое окно (независимо от того, введено ли значение или нет), вы получаете null. null не "null". (последняя строка).

Поэтому, когда пользователь закрывает диалоговое окно, name.equals("null") выдаст исключение нулевого указателя.

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

name = JOptionPane.showInputDialog("Please enter your name: ");
if (name != null)  //Proceed only when the user has entered a valid name
{
    yesNo = JOptionPane.showConfirmDialog(null, "So your name is "+name+". Is this correct?", "", JOptionPane.YES_NO_OPTION);
    if (yesNo == -1)
    {
        System.exit(0);
    }
    if (yesNo == 0)
    {
        break;
    }
}
else
{
    break;
}

Основная проблема в том, что у вас бесконечный цикл. Вам нужно выйти из цикла, вы можете использовать break, но тогда у вас есть еще один бесконечный цикл. Также добавьте нулевую проверку для этого имени в другой цикл:

while (name != null)  //Enter this loop only when the user has entered a name
{
    gender = JOptionPane.showInputDialog("Are you a boy or a girl?: ");

Кстати, я предполагаю, что это своего рода изучение того, что вы здесь делаете. Это определенно не хорошо в реальных приложениях. И вы можете объединить две петли, вам нужна только одна, а не две.

1 голос
/ 21 августа 2011

Если вы просто хотите, чтобы программа выходила, когда пользователь нажимает кнопку X, вы можете сделать что-то вроде этого:

JFrame frame = new JFrame("Greeter");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Add your questions to the frame
frame.setVisible(true);

Таким образом, когда окно закрывается, программа закрывается.

У Oracle есть отличные (и очень простые) учебные пособия по Swing (Java Windowy) для начинающих здесь .Они являются частью общего Java Tutorials .

...