Попытка разрешить ввод чисел в JTextField, а нечисловые значения установить как 0

У меня проблемы, ребята, это для моего класса конвертера Фаренгейта в Цельсий, я не могу заставить свой код распознавать следующее, что гарантирует, что в текстовое поле вводятся только числа, а если нет, то устанавливается как 0:

try {
            Double.parseDouble(fahr.getText());
        } catch (NumberFormatException e) {
            fahr.setText("0");
        }

Я думаю, это из-за размещения его в моем классе. Пожалуйста, ознакомьтесь с моим полным классом (я разместил его в нижней части кода):

public class Temperature implements ActionListener  {

    private static JTextField fahr;
    private static JTextField cels;
    private JFrame frame;
    private JButton first;
    private JButton second;
    private double fahrVal;
    private Double fahrConv;
    private double celsVal;
    private double celsConv;
    private NumberFormat amountFormat;


    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Temperature window = new Temperature();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public Temperature() {
        initialize();
        first.addActionListener((ActionListener) this);
        second.addActionListener((ActionListener) this);
    }

    private void initialize() { 
        amountFormat = NumberFormat.getNumberInstance();
        frame = new JFrame("raB eltiT");
        frame.setBounds(100, 50, 350, 350);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        first = new JButton("...To Celsius");
        first.setBounds(130, 60, 100, 50);
        first.setBackground(Color.cyan);
        first.setActionCommand("click");
        first.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                JButton src = (JButton) ae.getSource();
                //System.out.println("Button labeled " + src.getText() + " was clicked");
            }
        });
        first.addMouseListener(new MouseAdapter() {
            public void mouseReleased(MouseEvent me) {
                 cels.setText(String.valueOf(fahrConv));
            }
        });


        frame.getContentPane().add(first);

        second = new JButton("...To Fahrenheit");
        second.setBounds(130, 230, 100, 50);
        second.setBackground(Color.pink);
        second.setActionCommand("instead");
        frame.getContentPane().add(second);
        second.addMouseListener(new MouseAdapter() {
            public void mouseReleased(MouseEvent me) {
                 fahr.setText(String.valueOf(celsConv));
            }
        });

        // Build the Fahrenheit side

        JLabel fLabel = new JLabel("Fahrenheit");
        fahr = new JTextField("32");
        fahr.setPreferredSize(new Dimension(50,50));
        fahr.setHorizontalAlignment(JTextField.CENTER);
        JPanel fPanel = new JPanel();
        fPanel.setBounds(40, 120,100,100);
        fPanel.add(fLabel);
        fPanel.add(fahr);
        frame.getContentPane().add(fPanel);


        JLabel cLabel = new JLabel("Celsius");
        cels = new JTextField("0");
        cels.setPreferredSize(new Dimension(50,50));
        cels.setHorizontalAlignment(JTextField.CENTER);
        JPanel cPanel = new JPanel();
        cPanel.setBounds(220, 120, 100,100);
        cPanel.add(cLabel);
        cPanel.add(cels);
        frame.getContentPane().add(cPanel); 


        // Put it all up on the screen

        frame.setVisible(true);  

        try {// if is number
            Double.parseDouble(fahr.getText());
        } catch (NumberFormatException e) {
            fahr.setText("0");
        }
    }
    public void actionPerformed(ActionEvent event) {
         String fahrText = fahr.getText();
         fahrVal = Double.parseDouble(fahrText);
         fahrConv = ((fahrVal - 32)*5)/9;
         fahrConv = Double.parseDouble(new DecimalFormat("##.#").format(fahrConv));

        String celsText = cels.getText();
        celsVal = Double.parseDouble(celsText);
        celsConv = 32 + (celsVal * 9 / 5);
        celsConv = Double.parseDouble(new DecimalFormat("##.#").format(celsConv));


    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
17
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема не столько в том, что вы делаете Какие, сколько в том, что вы делаете где и когда. Вы звоните

try {// if is number
    Double.parseDouble(fahr.getText());
} catch (NumberFormatException e) {
    fahr.setText("0");
}

в коде, где вы Создайте GUI, и это происходит до того, как пользователь сможет ввести данные в JTextField, что делает этот код бесполезным. Лучшее решение — поместить этот код в прослушиватель, который отвечает, когда пользователь готов отправить данные, например, в Начало вашего ActionListener — затем вызовите return:

Что-то типа:

public void actionPerformed(ActionEvent event) {
    try {
        Double.parseDouble(fahr.getText());
    } catch (NumberFormatException e) {
        fahr.setText("0");
        // display a JOptionPane error message so the user knows there's been a problem
        return; // so the code below isn't called if input in error
    }
    String fahrText = fahr.getText();
    fahrVal = Double.parseDouble(fahrText);
    fahrConv = ((fahrVal - 32)*5)/9;
    fahrConv = Double.parseDouble(new DecimalFormat("##.#").format(fahrConv));

    String celsText = cels.getText();
    celsVal = Double.parseDouble(celsText);
    celsConv = 32 + (celsVal * 9 / 5);
    celsConv = Double.parseDouble(new DecimalFormat("##.#").format(celsConv));
}

Другие варианты:

  • Используйте JFormattedTextField
  • Или используйте JSpinner
  • Или используйте DocumentListener

Другие не связанные вопросы:

  • Не добавляйте MouseListeners в JButtons, а используйте ActionListeners. В противном случае слушатель не будет вести себя правильно. Например, MouseListener по-прежнему будет реагировать, если кнопка отключена, тогда как ActionListener не будет отвечать правильно в этой ситуации.
  • Избегайте пустых макетов и абсолютного позиционирования, так как это приводит к жесткому графическому интерфейсу, который трудно улучшать, отлаживать и который выглядит нормально на одной платформе и ужасно на всех других.

Спасибо, исправил проблему, приму к сведению другие ваши предложения.

V4k4 26.02.2019 04:43

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