2012-09-16 6 views
5

Ich benutze Eclipse, um einen Rechner zu bauen, und ich habe Probleme, weil ich 2 Werte vom Benutzer eingegeben haben muss. Hier ist mein Code für die Laufklasse.Wie erhalte ich Benutzereingaben von einem TextField und wandle sie in Double um?

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

    } 
} 

} 

und hier ist meine Klasse für die 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); 

} 

ich versuchte Double.parseDouble(window.textField.getText());

verwenden, aber das hat nicht funktioniert. Wie kann ich es zum Laufen bringen? Vielen Dank im Voraus.

+1

Was hat es getan? Hat es einen Fehler geworfen oder nicht kompiliert. Bitte präzisieren Sie [was Sie versucht haben] (http://whathaveyoutried.com) –

+1

Sie rufen 'Double.parseDouble (...)', bevor der Benutzer die Möglichkeit hatte, etwas in die Textfelder einzugeben. Fügen Sie eine print-Anweisung vor der 'parseDouble'-Anweisung hinzu, um den Wert von' window.textField.getText() 'zu sehen, und Sie werden sehen, dass es leer ist. – assylias

+1

Und erstellen Sie Ihre GUI in der EDT (wie Sie es im zweiten Code-Snippet getan haben). – assylias

Antwort

0

Zunächst denke ich, es gibt einige Probleme mit Ihrem Design des Programms.Warum nicht Ereignisse (Tastenklicks, Tastenanschläge gedrückt usw.), um die Berechnungen auszulösen? Ich sehe den Vorteil der While-Schleife in diesem Programm nicht.

Auch, wie einige Leute bereits darauf hingewiesen haben, liest und analysiert der Code Werte aus dem Textfeld bereits vor der Benutzereingabe. Das wird sicherlich zu ungültigen Ergebnissen führen.

Probieren Sie etwas wie (nicht getestet):

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

Du fordert Text aus dem TextField-, ohne tatsächlich zu überprüfen, ob der Text ist. Wenn Sie auf diese Weise eine Schleife erstellen möchten, müssen Sie zuerst feststellen, ob Text eingegeben wurde, und dann die Eingabe dem Doppel zuweisen. Ich würde jedoch eine andere Strategie empfehlen.

Ihre Logik der Verwendung einer Schleife hier ist meiner Meinung nach nicht die beste. Wenn Sie beide Zahlen aus dem TextField lesen müssen, würde ich tatsächlich einen KeyListener hinzufügen und auf die Enter-Taste warten. So etwas wie

PSEUDO-CODE

... 
// 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. 
     } 
    } 
} 

HELPFUL LINKS

Hier sind einige weitere Informationen über KeyListeners: http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html

Hier ist ein Link auf TextField- und wie zu verwenden sie: http://docs.oracle.com/javase/tutorial/uiswing/components/textfield.html

0

hier ist, wie Sie es tun können: „, aber das hat nicht funktioniert“

double value=Double.parseDouble(jtextfield-name.getText()); 
Verwandte Themen