Неправильное расположение моего кода system.exit - PullRequest
2 голосов
/ 21 марта 2011

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

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.*;

public class DayGUI extends JFrame {
    private JFrame mainFrame;
    private JButton cmdGood;
    private JButton cmdBad;
    private JButton cmdAverage;
    private JButton cmdExit;

    public DayGUI()
    {
        mainFrame = new JFrame("How are you feeling today?");

        cmdGood = new JButton("Good");
         cmdGood.setBackground(Color.GREEN);

        cmdBad = new JButton("Bad");
         cmdBad.setBackground(Color.RED);

         cmdAverage = new JButton("Average");
         cmdAverage.setBackground(Color.WHITE);

         cmdExit = new JButton("Exit");
         cmdExit.setBackground(Color.WHITE);

        Container c = mainFrame.getContentPane();
        c.setLayout(new FlowLayout());

        c.add(cmdGood);
        c.add(cmdBad);
        c.add(cmdAverage);
        c.add(cmdExit);

        cmdGood.setMnemonic('G');
        cmdBad.setMnemonic('B');
        cmdAverage.setMnemonic('A');
        cmdExit.setMnemonic('E');

        mainFrame.setSize(280, 100);
        mainFrame.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e) {System.exit(0);}
        });

        ButtonsHandler bhandler = new ButtonsHandler();
        cmdGood.addActionListener(bhandler);
        cmdBad.addActionListener(bhandler);
        cmdAverage.addActionListener(bhandler);
        cmdExit.addActionListener(bhandler);
        mainFrame.show();
        }
    class ButtonsHandler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)      
        {       
            if (e.getSource() == cmdGood)
                JOptionPane.showMessageDialog(null, "Today is a good day!",
                        "I'm Feeling Happy!", JOptionPane.INFORMATION_MESSAGE);
            else if (e.getSource() == cmdBad)
                JOptionPane.showMessageDialog(null, "I'm having a bad day today!",
                        "I'm Feeling Sad!", JOptionPane.INFORMATION_MESSAGE);
            else if (e.getSource() == cmdAverage)
                JOptionPane.showMessageDialog(null, "I'm having an average day!",
                        "I'm Feeling In The Middle", JOptionPane.INFORMATION_MESSAGE);
        }
    }
    private void cmdExit_pressed(){
        System.exit(0);
        }
    public static void main(String args[])
    {
        new DayGUI();
    }
}

Ответы [ 5 ]

3 голосов
/ 21 марта 2011

В вашем методе actionPerformed вы обрабатываете 3 различных источника событий (cmdGood, cmdBad, cmdAverage), но вы не обрабатываете cmdExit, даже если он использует тот же ActionListener.Добавьте обработку этого источника так же, как вы обрабатываете другие 3.

1 голос
/ 21 марта 2011

Причина уже была объяснена (cmdExit_pressed никогда не используется).Вот как ваша программа будет написана ближе к современным стандартам:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.*;

public class DayGUI extends JFrame {
    private JFrame mainFrame;
    private JButton cmdGood;
    private JButton cmdBad;
    private JButton cmdAverage;
    private JButton cmdExit;

    public DayGUI()
    {
        mainFrame = new JFrame("How are you feeling today?");

        cmdGood = new JButton("Good");
        cmdGood.setBackground(Color.GREEN);

        cmdBad = new JButton("Bad");
        cmdBad.setBackground(Color.RED);

        cmdAverage = new JButton("Average");
        cmdAverage.setBackground(Color.WHITE);

        cmdExit = new JButton("Exit");
        cmdExit.setBackground(Color.WHITE);

        Container c = mainFrame.getContentPane();
        c.setLayout(new FlowLayout());

        c.add(cmdGood);
        c.add(cmdBad);
        c.add(cmdAverage);
        c.add(cmdExit);

        cmdGood.setMnemonic('G');
        cmdBad.setMnemonic('B');
        cmdAverage.setMnemonic('A');
        cmdExit.setMnemonic('E');

        mainFrame.setSize(280, 100);
        mainFrame.addWindowListener(new WindowAdapter()
            {
                public void windowClosing(WindowEvent e) {System.exit(0);}
            });

        cmdGood.addActionListener(new ActionListener() {
                public void actionPerformed() {
                    JOptionPane.showMessageDialog(null, "Today is a good day!",
                                                  "I'm Feeling Happy!", JOptionPane.INFORMATION_MESSAGE);
                }
            });
        cmdBad.addActionListener(new ActionListener() {
                public void actionPerformed() {
                    JOptionPane.showMessageDialog(null, "I'm having a bad day today!",
                                                  "I'm Feeling Sad!", JOptionPane.INFORMATION_MESSAGE);
                }
            });
        cmdAverage.addActionListener(new ActionListener() {
                public void actionPerformed() {
                    JOptionPane.showMessageDialog(null, "I'm having an average day!",
                                                  "I'm Feeling In The Middle", JOptionPane.INFORMATION_MESSAGE);
                }
            });
        cmdExit.addActionListener(new ActionListener() {
                public void actionPerformed() {
                    System.exit();
                }
            });

        mainFrame.show();
    }
    public static void main(String args[])
    {
        new DayGUI();
    }
}

Таким образом, каждая кнопка получает свой собственный ActionListener, и вам не нужно делать это if (source == ...) сравнений.

Еще лучше было бы использовать Action объекты (т.е. анонимные подклассы AbstractAction) здесь.

1 голос
/ 21 марта 2011

У вас нет условия для cmdExit внутри вашего actionPerformed метода.Добавьте один:

else if (e.getSource() == cmdExit)
    cmdExit_pressed();
0 голосов
/ 21 марта 2011

Э-э, эта часть в порядке.

Проблема в том, что вы не даете этой кнопке ActionListener

0 голосов
/ 21 марта 2011

Ваш cmdExit_pressed ничем не вызван.Почему вы ожидали, что это будет?

Все действия должны выполняться через интерфейс ActionListener.

Я настоятельно рекомендую иметь отдельную ActionListener на кнопку, а не однудля них все с циклом if / else внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...