2012-09-16 10 views
5

Używam Eclipse do zbudowania kalkulatora i mam problemy, ponieważ potrzebuję 2 wartości wprowadzonych przez użytkownika. Oto mój kod dla klasy run.W jaki sposób uzyskać dane wejściowe użytkownika z pola tekstowego i przekonwertować je na podwójne?

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

    } 
} 

} 

i tu jest moja klasa dla 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); 

} 

Próbowałem za pomocą Double.parseDouble(window.textField.getText());

ale to nie działa. Jak mogę to sprawić? Z góry dzięki.

+1

Co to zrobiło? Zrobił błąd lub nie skompilował. Dokładnie opisz [to, co próbujesz] (http://whathaveyoutried.com) –

+1

Zadzwoń pod "Double.parseDouble (...)", zanim użytkownik będzie miał szansę wprowadzić cokolwiek w polach tekstowych. Dodaj instrukcję print przed instrukcją 'parseDouble', aby zobaczyć wartość' window.textField.getText() ', a zobaczysz, że jest pusta. – assylias

+1

Stwórz swój GUI w EDT (tak jak zrobiłeś to w drugim fragmencie kodu). – assylias

Odpowiedz

0

Po pierwsze myślę, że są pewne problemy z projektem programu. Dlaczego nie używać zdarzeń (kliknięcia przycisków, naciśnięcia klawiszy itp.), Aby uruchomić obliczenia? Nie widzę korzyści pętli while w tym programie.

Ponadto, jak niektórzy już zauważyli, twój kod czyta i analizuje wartości z pola tekstowego jeszcze przed wprowadzeniem danych przez użytkownika. To z pewnością przyniesie nieprawidłowe wyniki.

spróbować czegoś jak (nie testowane):

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

Żądasz tekst z TextField bez faktycznie sprawdzenie, czy tekst ma. Jeśli chciałbyś zapętlić się w ten sposób, najpierw musisz sprawdzić, czy wprowadzono tekst, a następnie przypisać wejście do podwójnego. Poleciłbym jednak inną strategię.

Twoja logika korzystania z pętli nie jest najlepsza w mojej opinii. Jeśli musisz odczytać obie liczby z pola TextField, dodaję KeyListener i czekam na klawisz Enter. Coś jak

pseudokod

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

przydatne linki

Oto więcej informacji na KeyListeners: http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html

Oto link na TextField i jak używać je: http://docs.oracle.com/javase/tutorial/uiswing/components/textfield.html

0

oto jak można to zrobić „ale to nie zadziałało”

double value=Double.parseDouble(jtextfield-name.getText()); 
Powiązane problemy