0

El problema es el siguiente:

Tengo que hacer una aplicación que convierta de grados Celsius a Fahrenheit interactuando con un JPanel, unos JTextField o y un JButton. El problema que tengo es que cuando introduzco un número en el JTextField de grados Celsius me hace bien el cálculo, es decir, calcula el Fahrenheit en función del Celsius. Para hacerlo a viceversa, no lo hace.

public class Ventana extends JFrame {

     JPanel jp; 
     JTextField cajaCelsius;
     JTextField cajaFarenheit;
     JLabel etiquetaCelsius;
     JLabel etiquetaFarenheit;
     JButton conversion;
     double gradosFarenheit = 0.0;
     double gradosCelsius = 0.0;

     public Ventana() {
         setSize(400, 200); 
         setLocationRelativeTo(null);
         setDefaultCloseOperation(EXIT_ON_CLOSE);
         setTitle("Conversion de celsius a farenheit y viceversa");
         inicioComponentes();
     }

     private void inicioComponentes() {
        jp = new JPanel(); 
        jp.setLayout(null); //Ponemos a null el diseño predeterminado Layout
        Etiquetas();
        cajaEscribir();
        Botones();
        this.getContentPane().add(jp); //Añadimos al panel de la ventana
     }

     private void Etiquetas() {
        etiquetaCelsius = new JLabel();
        etiquetaCelsius.setText("Celsius:");
        etiquetaCelsius.setBounds(70, 0, 100, 100);
        etiquetaFarenheit = new JLabel();
        etiquetaFarenheit.setText("Farenheit:");
        etiquetaFarenheit.setBounds(50, 30, 100, 100);
        jp.add(etiquetaCelsius);
        jp.add(etiquetaFarenheit);
     }

     private void Botones() {
        conversion = new JButton();
        conversion.setBounds(170, 100, 100, 50);
        conversion.setText("Conversion");
        jp.add(conversion);

         ActionListener al = new ActionListener() {

            double grados;

            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    System.out.println("iee");
                    //Si escribe sobre el Celsius
                    if (cajaCelsius.getText() != "0.0") {
                        grados = Double.parseDouble(cajaCelsius.getText());
                        gradosFarenheit = (grados * (9.0 / 5.0)) + 32;
                        System.out.println("Estic al primer if, grausTeclat: "+grados+", grausFarenheit: "+gradosFarenheit);
                        String s = (""+gradosFarenheit); 
                        cajaFarenheit.setText(s);
                        System.out.println("Farenheit: "+gradosFarenheit);
                     }
                    //Si escribe sobre el Farenheit
                     else if (cajaFarenheit.getText() != "32.0") {
                        System.out.println("has tocar es farenheit");
                        grados = Double.parseDouble(cajaFarenheit.getText());
                        gradosCelsius = ((grados - 32.0) * (5.0 / 9.0));
                        System.out.println("Estic al segon if, grausTeclat: "+grados+", grausCelsius: "+gradosCelsius);                        
                        String s = (""+gradosCelsius);
                        cajaCelsius.setText(s);
                        System.out.println("Celsius: "+gradosCelsius);
                     }
                 } catch (NumberFormatException a) {
                    System.out.println("estic a s'exception");
                    cajaCelsius.setText("0.00");
                    cajaFarenheit.setText("32.00");
                 }

             }
         };

         conversion.addActionListener(al);
     }

     private void cajaEscribir() {
        cajaCelsius = new JTextField();
        cajaCelsius.setBounds(120, 40, 250, 20);
        cajaCelsius.setText("0.0");
        cajaFarenheit = new JTextField();
        cajaFarenheit.setBounds(120, 70, 250, 20);
        cajaFarenheit.setText("32.0");
        jp.add(cajaCelsius);
        jp.add(cajaFarenheit);
     }
}

Si ejecutas el código funciona perfectamente. A lo mejor en la parte del ActionListener no he puesto el if-else bien pero, si estuviera mal, no me entraría ni en el primero.

smt
  • 580
  • 4
  • 16
Don_Pedro
  • 93
  • 11

1 Answers1

1

El problema es que siempre está entrando a la primera condición if (cajaCelsius.getText() != "0.0") ya que esa condición siempre se cumple al utilizar !=.

Para comparar valores String u Object hay que utilizar el método .equals. Además, deberías comprobar que, al menos, un JTextField esté vacío en el momento de la conversión para que quede claro si conviertes Celsius o Fahrenheit.

@Override
public void actionPerformed(ActionEvent e) {
    try {
        System.out.println("iee");
        //Si escribe sobre el Celsius
        if (!cajaCelsius.getText().equals("0.0") && cajaFarenheit.getText().isEmpty()) {
            grados = Double.parseDouble(cajaCelsius.getText());
            gradosFarenheit = (grados * (9.0 / 5.0)) + 32;
            System.out.println("Estic al primer if, grausTeclat: "+grados+", grausFarenheit: "+gradosFarenheit);
            String s = (""+gradosFarenheit); 
            cajaFarenheit.setText(s);
            System.out.println("Farenheit: "+gradosFarenheit);
        }
        //Si escribe sobre el Farenheit
         else if (!cajaFarenheit.getText().equals("32.0") && cajaCelsius.getText().isEmpty()) {
            System.out.println("has tocar es farenheit");
            grados = Double.parseDouble(cajaFarenheit.getText());
            gradosCelsius = ((grados - 32.0) * (5.0 / 9.0));
            System.out.println("Estic al segon if, grausTeclat: "+grados+", grausCelsius: "+gradosCelsius);                        
            String s = (""+gradosCelsius);
            cajaCelsius.setText(s);
            System.out.println("Celsius: "+gradosCelsius);
        }
    } catch (NumberFormatException a) {
        System.out.println("estic a s'exception");
        cajaCelsius.setText("0.00");
        cajaFarenheit.setText("32.00");
        a.printStackTrace();
    }

}
smt
  • 580
  • 4
  • 16
  • Lo has compilado? Estas en lo cierto, lo he estado mirando, el problema es que por defecto, al inicio, siempre tengo 0.0 celsius i 32.0 farenheit. Por eso es que si cambio el celsius me entra en la primera condición, sino me entra en la segunda (que sería cuando edito los farenheit para que me calcule los celsius). – Don_Pedro Apr 27 '19 at 14:07
  • Don_Pedro sí, lo he compilado antes de escribir la contestación. Siempre que uno de los campos esté vacío, hará la conversíón correspondiente. Tú planteamiento no es muy claro tal y como lo comentas (o no lo veo muy lógico). El programa no va a saber qué `JTextField` debe convertir si ambos tienen valores... ¿es un requisito del ejercicio? Me refiero a que ambos `JTextField` deban tener valores para poder realizar el cálculo. – smt Apr 27 '19 at 15:12
  • No, no es un requisito, eso lo puse yo por puro detallísmo. He puesto ambos JTextField vacíos y me va bien, así como tú me has dicho. Siempre me lio cuando quiero perfeccionar las cosas.. – Don_Pedro Apr 28 '19 at 16:31