2012-09-16 8 views
5

Sto usando Eclipse per costruire una calcolatrice e sto avendo problemi perché ho bisogno di avere 2 valori inseriti dall'utente. Ecco il mio codice per la classe run.Come ottengo l'input dell'utente da un campo di testo e lo converto in doppio?

import display.Gui; 

public class Main { 

public static void main(String argsp[]) { 

    Gui window = new Gui(); 
    double a = 0, b = 0, c = 0; 
    String operator; 
    boolean calculate = true; 

    window.setVisible(true); 
    window.setSize(500, 400); 
    window.setResizable(false); 
    window.setLocationRelativeTo(null); 

    while (calculate) { 
     window.textArea_1.append("Enter an equation.\n"); 
     a = Double.parseDouble(window.textField.getText()); 
     operator = window.textField.getText(); 
     b = Double.parseDouble(window.textField.getText()); 

     if (operator.contains("+")) 
      c = a + b; 

     if (operator.contains("-")) 
      c = a - b; 

     if (operator.contains("*")) 
      c = a * b; 

     if (operator.contains("/")) 
      c = a/b; 

     if (operator.contains("x^2")) 
      c = a * a; 

     if (operator.contains("sqrt")) 
      c = Math.sqrt(a); 

     if (operator.contains("%")) 
      c = a/100; 

     window.textArea.append("" + c + "\n"); 
     window.textArea.append(""); 
     window.textArea.append("Would you like to make another calculation? [Yes/No]\n"); 

     String calculation = window.textField.getText(); 

     try { 
     if (calculation.equalsIgnoreCase("Yes")) 
      calculate = true; 

     if (calculation.equalsIgnoreCase("No")) 
      calculate = false; 
     } catch (Exception e) { 
      window.textArea_1.append("Please enter yes or no"); 
     } 

    } 
} 

} 

e qui è la mia classe per il JFrame:

import java.awt.Dimension; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import java.awt.BorderLayout; 
import javax.swing.JTextField; 
import javax.swing.JTextArea; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class Gui extends JFrame { 

public JTextArea textArea, textArea_1; 
public JTextField textField; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       Gui frame = new Gui(); 
       frame.setVisible(false); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public Gui() { 
    setBounds(100, 100, 450, 300); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    getContentPane().setLayout(new BorderLayout(0, 0)); 

    textField = new JTextField(); 
    textField.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent Ev) { 
      textArea.append(textField.getText() + "\n"); 
      textField.setText(""); 
     } 
    }); 
    textField.requestFocus(); 
    getContentPane().add(textField, BorderLayout.SOUTH); 
    textField.setColumns(10); 

    textArea = new JTextArea(); 
    textArea.setEditable(false); 
    textArea.setPreferredSize(new Dimension(215, 200)); 
    getContentPane().add(textArea, BorderLayout.WEST); 

    textArea_1 = new JTextArea(); 
    textArea_1.setEditable(false); 
    textArea_1.setPreferredSize(new Dimension(215, 200)); 
    getContentPane().add(textArea_1, BorderLayout.EAST); 

} 

Ho provato ad utilizzare Double.parseDouble(window.textField.getText());

ma che non ha funzionato. Come posso farlo funzionare? Grazie in anticipo.

+1

Cosa ha fatto? Ha generato un errore o non è stato compilato. Si prega di essere specifici su [cosa si è provato] (http://whathaveyoutried.com) –

+1

Si chiama 'Double.parseDouble (...)' prima che l'utente abbia avuto la possibilità di inserire qualcosa nei campi di testo. Aggiungi un'istruzione print prima dell'istruzione 'parseDouble' per vedere il valore di' window.textField.getText() 'e vedrai che è vuoto. – assylias

+1

E crea la tua GUI nell'EDT (come hai fatto nel secondo snippet di codice). – assylias

risposta

0

Prima di tutto penso che ci siano alcuni problemi nella progettazione del programma. Perché non usare gli eventi (clic sui pulsanti, tasti premuti, ecc.) Per attivare i calcoli? Non vedo il vantaggio del ciclo while in questo programma.

Inoltre, come alcuni hanno già sottolineato, il codice sta leggendo e analizzando i valori dal campo di testo anche prima dell'input dell'utente. Questo sicuramente produrrà risultati non validi.

provare qualcosa di simile (non testato):

calcButton = new JButton("Calculate"); 
calcButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent Ev) { 
     actionCalc(); 
    } 
}); 


public void actionCalc(){ 
    // get the string 
    // validate string (check for empty string etc) 
    // parse to Double 
    Double val = Double.parseDouble(window.textField.getText()); 
    ... 
} 
0

si richiede il testo dal TextField senza realmente controllare se il testo è lì. Se desideri eseguire il loop in questo modo, devi prima vedere se è inserito del testo, quindi assegnare l'input al doppio. Consiglierei comunque una strategia diversa.

La tua logica di utilizzare un loop qui non è la migliore secondo me. Se è necessario leggere entrambi i numeri dal TextField, aggiungerei effettivamente un KeyListener e attendo il tasto Invio. Qualcosa di simile

pseudo-codice

... 
// global vals 
double a = Null; 
double b = Null; 
public void keyPressed(KeyEvent e) { 
    if (e.getKeyCode() == KeyEvent.VK_ENTER) { 
     if (!window.textField.getText().equals("")) { 
      // check if input is a legal double value 
      // notify user that you recieved the first number 
      // and request the next input. 
      // once both inputs have been entered do your calculation and 
      // output the result. The program will continue to respond to key triggers. 
     } 
    } 
} 

LINK UTILI

Ecco qualche informazione in più su KeyListeners: http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html

Ecco un link sul TextField e come utilizzare loro: http://docs.oracle.com/javase/tutorial/uiswing/components/textfield.html

0

ecco come si può fare: ", ma che non ha funzionato"

double value=Double.parseDouble(jtextfield-name.getText()); 
Problemi correlati