Интерфейс Java по Фаренгейту / Цельсию с кнопкой

Я новичок в Java GUI, и для класса мне нужно создать программу, которая конвертирует Фаренгейт в Цельсий и наоборот. Я хотел создать программу с графическим интерфейсом, которая бы использовала кнопку, но не могу найти ни одной публикации в Интернете, которая бы мне помогла. У меня проблемы с тем, что кнопка действительно работает правильно. Он отлично конвертируется из Фаренгейта в Цельсий, но не конвертирует Цельсий в Фаренгейт. Я знаю, что в логике есть очевидная ошибка, но я не могу понять это на всю жизнь. Любая помощь приветствуется.

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.text.DecimalFormat;

    @SuppressWarnings("serial")
    public class Temperature_Converter extends JFrame{
    private static final double CelsiusTOFarenheit = 9.0 / 5.0;
    private static final double FahrenheitTOCelsius = 5.0 / 9.0;
    private static final int offset = 32;
    private JLabel LFahrenheit, LCelsius; //Labels
    private JTextField TFFahrenheit, TFCelsius; //Text Fields
    private JButton BConvert; //Convert Button
    private ConvertButtonHandler ConvButtonHandler;

    public Temperature_Converter() {
    setTitle("Temperature Converter");
    Container pane = getContentPane();
    pane.setLayout(new GridLayout(1,5));

    LFahrenheit = new JLabel("Farenheit:", JLabel.CENTER);
        pane.add(LFahrenheit);
    TFFahrenheit = new JTextField();
        pane.add(TFFahrenheit);
    BConvert = new JButton("Convert");
        pane.add(BConvert);
            ConvButtonHandler = new ConvertButtonHandler();
            BConvert.addActionListener(ConvButtonHandler);
    LCelsius = new JLabel("Celsius:", JLabel.CENTER);
        pane.add(LCelsius);
    TFCelsius = new JTextField();
        pane.add(TFCelsius);

    setSize(600, 85);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}
 private class ConvertButtonHandler implements ActionListener{
        public void actionPerformed(ActionEvent e){
            double celsius = 0, fahrenheit = 0;

            DecimalFormat twoDigits = new DecimalFormat("0.00");     
                    celsius = Double.parseDouble(TFCelsius.getText());
                    fahrenheit = Double.parseDouble(TFFahrenheit.getText());
                        celsius = (fahrenheit - offset) * FahrenheitTOCelsius;
                        fahrenheit = celsius * CelsiusTOFarenheit + offset;
                            TFCelsius.setText(" "+ twoDigits.format(celsius));
                            TFFahrenheit.setText(" "+ twoDigits.format(fahrenheit));       
    }
 }

public static void main(String[] args) {
    new Temperature_Converter();
}

}

3 ответа

Решение

Вот что может вам помочь: оставьте пустым текстовое поле, которое вы хотите заполнить (оставьте пустым значение по Фаренгейту, если хотите конвертировать из Цельсия в Фаренгейт).

 @Override
public void actionPerformed(final ActionEvent e) {
    double celsius = 0, fahrenheit = 0;
    DecimalFormat twoDigits = new DecimalFormat("0.00");
    if (Temperature_Converter.this.TFCelsius.getText() == null || "".equals(Temperature_Converter.this.TFCelsius.getText().trim())) {
        // convert from fahrenheit to celsius
        fahrenheit = Double.parseDouble(Temperature_Converter.this.TFFahrenheit.getText());
        celsius = (fahrenheit - Temperature_Converter.offset) *   Temperature_Converter.FahrenheitTOCelsius;
        Temperature_Converter.this.TFCelsius.setText(" " + twoDigits.format(celsius));
    } else if (Temperature_Converter.this.TFFahrenheit.getText() == null || "".equals(Temperature_Converter.this.TFFahrenheit.getText().trim())) {
           // convert from celsius to fahrenheit
           celsius = Double.parseDouble(Temperature_Converter.this.TFCelsius.getText());
           fahrenheit = celsius * Temperature_Converter.CelsiusTOFarenheit + Temperature_Converter.offset;
           Temperature_Converter.this.TFFahrenheit.setText(" " + twoDigits.format(fahrenheit));
    }
}

Редактировать: Вы можете проверить введенный пользователем текст и предупредить пользователя, если есть что-то еще, кроме чисел, введенных как температура.

try {
    fahrenheit = Double.parseDouble(Temperature_Converter.this.TFFahrenheit.getText());
} catch (NumberFormatException e1) {
     //alert the user       
    JOptionPane.showMessageDialog(null, "You are allowed to introduce numbers only for temperature");
    return;
}

Предполагая, что мне нужно поместить одно значение в поле Фаренгейта и одно в поле Цельсия, и они должны быть рассчитаны одновременно, вы должны "кэшировать" ваши расчетные значения в других переменных, отличных от тех, которые вы получили из текстовых полей.,

Когда вы делаете это:

celsius = Double.parseDouble(TFCelsius.getText());
fahrenheit = Double.parseDouble(TFFahrenheit.getText());
celsius = (fahrenheit - offset) * FahrenheitTOCelsius;
fahrenheit = celsius * CelsiusTOFarenheit + offset;

результат вашего первого вычисления (новое значение в градусах Цельсия) будет использоваться во втором вычислении, что приведет к тому же результату, что и значение в поле Фаренгейта, которое было изначально (поскольку оно просто конвертирует значение в градусы Цельсия и затем обратно)

Решением вашей проблемы является сохранение ваших результатов в новых переменных, таких как:

celsius = Double.parseDouble(TFCelsius.getText());
fahrenheit = Double.parseDouble(TFFahrenheit.getText());
double celsiusNew = (fahrenheit - offset) * FahrenheitTOCelsius;
double fahrenheitNew = celsius * CelsiusTOFarenheit + offset;
TFCelsius.setText(" "+ twoDigits.format(celsiusNew));
TFFahrenheit.setText(" "+ twoDigits.format(fahrenheitNew));

Это сделает свое дело.

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

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

Итак, ваша проблема в этих двух строках:

 celsius = Double.parseDouble(TFCelsius.getText());
 fahrenheit = Double.parseDouble(TFFahrenheit.getText());

Чтобы решить это, вы можете сделать так, например:

if (!TFCelsius.getText().equals("")) {
     celsius = Double.parseDouble(TFCelsius.getText());
 } else {
     ////i don't know what the value but make it equal 0
 }
Другие вопросы по тегам