Интерфейс 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
}