2014-02-04 2 views
1

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

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

}

ответ

2

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

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

Edit: Вы можете проверить текст пользовательского ввода и предупреждает пользователя, если есть что-то еще, то цифры, введенные как температура.

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; 
} 
+0

Это было здорово. Он полностью исправил мою проблему. Я знал, что должно было быть утверждение if где-то, я просто не знал, как это сделать. Моя логика CS по-прежнему не самая лучшая. Благодаря! – Mowza2k2

+0

@ Mowza2k2 вы разрабатываете свою логику CS, делая такие проблемы. Продолжайте движение, и вы многое продвинетесь. Кстати, просмотрите часть редактирования сообщения для удобного оповещения. – Daniel

+0

большое спасибо. Все, что вы опубликовали, имело для меня смысл, хотя я не знал, как это сделать сам. Приятно иметь куда пойти, где я могу получить помощь (без прослушивания моего профессора). – Mowza2k2

0

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

так, ваша проблема в этом две линии:

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 
} 
+1

Спасибо за ответ. Я ценю всю помощь. – Mowza2k2

1

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

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

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

Это сделает трюк.

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

+0

Спасибо тонну. Наряду с другим текстом все отлично работает. – Mowza2k2