Java GUI конвертер Фаренгейта/Цельсия с кнопкой

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

    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();
}

}


person Mowza2k2    schedule 04.02.2014    source источник


Ответы (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;
}
person Daniel    schedule 04.02.2014
comment
Это было здорово. Это полностью решило мою проблему. Я знал, что где-то должен быть оператор if, но я просто не знал, как это сделать. Моя логика CS все еще не самая лучшая. Спасибо! - person Mowza2k2; 04.02.2014
comment
@ Mowza2k2, вы развиваете свою логику CS, решая такие задачи. Продолжайте в том же духе, и вы сильно продвинетесь. Кстати, посмотрите часть редактирования сообщения для удобного предупреждающего сообщения. - person Daniel; 04.02.2014
comment
Спасибо большое. Все, что вы написали, имело для меня смысл, хотя я сам не знал, как это сделать. Приятно иметь куда-то пойти, где я могу получить некоторую помощь (не беспокоя моего профессора). - person Mowza2k2; 04.02.2014
comment
@ Mowza2k2 всегда пожалуйста. Я рад, что вы чувствуете себя желанным гостем в сообществе и что вы найдете здесь свои ответы. - person Daniel; 04.02.2014

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

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

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));

Это поможет.

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

person markusthoemmes    schedule 04.02.2014

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

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

 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
 }
person Alya'a Gamal    schedule 04.02.2014
comment
Спасибо за ответы. Я ценю всю помощь. - person Mowza2k2; 04.02.2014