# JTextField() Werte werden nicht übernommen und berechnet



## korona (4. Oktober 2011)

Hallo,

ich habe zwei Probleme mit der Anwendung.

1. Wenn ich z.B. für die Bildgröße 7.874 und für den Abbildungsmaßstab 0.3028 eingebe erhalte ich für die Gegenstandsweite kein Ergebnis. Es wird nur 0.0 angezeigt.

2. Bei der Berechnung des Abbildungsmaßstabes ändert sich der Wert der Gegenstandsgröße und der Wert wird nicht berechnet.

Kurz gesagt es wird nichts berechnet und die eingegebenen Werte ändern sich.
Woran kann das liegen?

Danke und Gruß


```
import java.awt.*;
import javax.swing.*;
import javax.swing.JFrame;
import java.awt.event.*;

public class Abbildungsmaßstab implements ActionListener{
    
    JFrame fr;
    JTextField text1, text2, text3;
    JButton ok, lo;
    String b, g, ß;
    double gg, bb, ßß, wert;
    
    public void setLayout(){
        
        fr = new JFrame();
        fr.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        fr.setResizable(false);
        fr.setLocation(500, 300);

        fr.setLayout( new GridLayout(4, 2, 20, 5) );
        
        JLabel lable1 = new JLabel("Bildgröße:");
        fr.add(lable1);     
        text1 = new JTextField();
        text1.setName("b");
        text1.addActionListener(this);
        fr.add(text1);
        
        JLabel lable2 = new JLabel("Gegensgröße:");
        fr.add(lable2);
        text2 = new JTextField(); 
        text2.setName("g");
        text2.addActionListener(this);
        fr.add(text2);
        
        JLabel lable3 = new JLabel("Abbildungsmaßstab");
        fr.add(lable3);
        text3 = new JTextField();
        text3.setName("f");
        text3.addActionListener(this);
        fr.add(text3);
        
        ok = new JButton ("Berechnen");
        ok.setName("ok");
        ok.addActionListener(this);
        fr.add(ok);
        lo = new JButton ("Löschen");
        lo.setName("lo");
        lo.addActionListener(this);       
        fr.add(lo);
     
        fr.pack();
        fr.setVisible( true ); 
    }
     
    public void actionPerformed(ActionEvent event){
                
        if ("Berechnen".equals(event.getActionCommand())){
            
            if (text1.getText().isEmpty() == true && text2.getText().isEmpty() == true && text3.getText().isEmpty() == true){
                JDialog dia = new JDialog(fr, "Falsche Eingabe");
                dia.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
                dia.setResizable(false);
                dia.setLocation(500, 300);
                dia.setSize(300, 100);
                dia.setVisible(true);
            } 
            if (text1.getText().isEmpty() == false && text2.getText().isEmpty() == false && text3.getText().isEmpty() == false){
                text1.setText("");
                text2.setText("");
                text3.setText("");
            }
// --------- Abbildungsmaßstab  -----------                   
            if (text1.getText().isEmpty() == false && text2.getText().isEmpty() == false){
                b = text1.getText();
                bb = Double.parseDouble(b);
                g = text2.getText();
                gg = Double.parseDouble(g);                    
                wert = Optikformeln.calcAbbildungsmaßstab(bb, gg);  
                wert = Math.rint((wert * 100)/100);
                text3.setText(String.valueOf(wert));   
            }
// --------- Bildgroeße   -----------
            if (text2.getText().isEmpty() == false && text3.getText().isEmpty() == false){
                g = text2.getText();
                gg = Double.parseDouble(g);
                ß = text3.getText();
                ßß = Double.parseDouble(ß);                    
                wert = Optikformeln.calcBildgroeße(ßß, gg); 
                wert = Math.rint((wert * 100)/100);
                text1.setText(String.valueOf(wert));                    
            }
// -------   Gegenstandsgroeße  ----------------
            if (text1.getText().isEmpty() == false && text3.getText().isEmpty() == false){
                b = text1.getText();
                bb = Double.parseDouble(b);
                ß = text3.getText();
                ßß = Double.parseDouble(ß);                    
                wert =  Optikformeln.calcGegenstandsgroeße(bb, ßß);
                wert = Math.rint((wert * 100)/100);
                text2.setText(String.valueOf(wert));                    
            }
            
        }
        if("Löschen".equals(event.getActionCommand())){
            text1.setText("");
            text2.setText("");
            text3.setText("");
        }
    }   
    public static void main(String[] args) {
        Abbildungsmaßstab ab = new Abbildungsmaßstab();       
        ab.setLayout();      
    }   
}
```

Klasse mit Formeln (die Formeln der Abbildungsgleichung sollen mit dieser Anwendung nichts zu tun haben)


```
public class Optikformeln {
// Abbildungsgleichung
// Bildweite
    static double calcBildweite(double g, double f){        
        double bildw = (g * f)/(g - f);       
        return bildw;
    }
// Gegenstandsweite
    static double calcGegenstand(double f, double b){        
        double gegen = (f * b)/(b - f);       
        return gegen;
    }
// Brennweite
    static double calcBrenweite(double g, double b){        
        double brenn = (g * b)/(g + b);       
        return brenn;
    }
    
// Die Elemente des Abbildungsmaßstabes
// Abbildungsmaßstab
    static double calcAbbildungsmaßstab(double b, double g){        
        double abb = b/g;       
        return abb;
    }
// Bildgroeße
    static double calcBildgroeße(double beta, double g){        
        double bild = beta*g;       
        return bild;
    }
// Gegenstandsgröße
    static double calcGegenstandsgroeße(double b, double beta){        
        double g = b/beta;       
        return g;
    }
    
}
```


----------



## vfl_freak (4. Oktober 2011)

Moin,

habe den Code jetzt nur überflogen und nicht im Detail analysiert, aber wo werden denn die Inhalte für *text1 *- *text3 *eingelesen und gesetzt 

Gruß
Klaus


----------



## korona (4. Oktober 2011)

Hi,

hier sind die Zeilen. Die ersten beiden bekommen den Wert durch 
	
	
	



```
get.Text()
```
 die dritte soll den berechneten Wert in das Textfeld setzen.

für Abbildungsmaßstab
text1 Zeile = 76
text2 Zeile = 78
text3 Zeile = 82

für Bildgröße
text2 Zeile = 86
text3 Zeile = 88
text1 Zeile = 92

für Gegenstandsgröße
text1 Zeile = 95
text3 Zeile = 97
text2 Zeile = 101


----------



## vfl_freak (4. Oktober 2011)

Moin,

oh, nein  - da liegst Du falsch !

Mit

```
b = text1.getText();
```
wird nur ein Inhalt des Textfeldes *text1* ausgelesen. 

Es muss aber auch zuvor gefüllt werden!
Bspw.:

```
text1.setText( "Mein Text");
```

Und ich sehe - wie gesagt - in Deinem Code keine Stellen, an denen diese 3 Felder mit Werten gefüllt werden ! 

siehe auch hier:
http://download.oracle.com/javase/6/docs/api/

Gruß
Klaus


----------



## korona (4. Oktober 2011)

Das Textfeld wird doch durch die Benutzereingabe gefüllt.

Ich überprüfe doch sogar in Zeile 61 mit einer if Anweisungen ob die Felder ausgefüllt sind.

```
if (text1.getText().isEmpty() == true && text2.getText().isEmpty() == true && text3.getText().isEmpty() == true)
```

In einem nächsem Schrit mit einer weitern if Anweisung z.B. Zeile 75 welche Formel benutzt werden muss.

```
if (text1.getText().isEmpty() == false && text2.getText().isEmpty() == false)
```


----------



## vfl_freak (4. Oktober 2011)

Moin,

ah, stimmt - das stehen ja am Ende noch die "setText" ....

Allerdings wird immer nur in ersten IF *text3* gefüllt !
Und dies dann so ist, sind die die beiden folgenden Anweisungen *immer* false !

In welchen Fällen soll denn was gefüllt werden?

Setz' ggf. hinter die Zeilen mit "setText" jeweils in println ...

EDIT: 
Was mich auch noch irritiert: da ja initial alle drei Textfelder leer sind, müsstet Du doch den Dialog "Falsche Eingabe" IMMER bekommen, oder ****

Gruß
Klaus


----------



## Fabio Hellmann (4. Oktober 2011)

Hi,

mach doch immer nach deinem Calc-Aufruf mal eine Ausgabe, um das Zwischenergebnis zu überprüfen.

```
wert = Optikformeln.calc...(<parameter>, <parameter>);
System.out.println("Wert = " + wert);
```

Gruß

Fabio


----------



## korona (4. Oktober 2011)

Hi,
ich antworte mal rückwärts.

@Fabio
Werde ich mal ausprobieren wobei ich der festen Überzeugung bin das es auf Konsole funktoniert. Vorher hatte ich anstelle von Double Integer (Natürlich keine Eingabe von Kommawertern!) da habe ich eine ArithmeticException bekommen weil ich angeblich durch Null teilen würde. Allerdings war das bei den Abbildungsgleichungen bei den ich übrigens das gleiche Problem habe.

@Klaus


> müsstet Du doch den Dialog "Falsche Eingabe" IMMER bekommen, oder ****


Nein, der Benutzer füllt zwei Felder aus damit ist eine der drei if-Anweisungen  (Abbildungsmaßstab, Bildgröße, Gegenstandsgröße) erfüllt.



> Allerdings wird immer nur in ersten IF text3 gefüllt


Es kommt drauf an welche Felder vom Nutzer augefüllt werden. Wenn die z.B. die Bildgröße bestimmt werden soll füllt der Nutzer die Felde Gegenstandsgröße (text2) und Abbildungsmaßstab (text3) aus und das entsprechend freie Feld wird berechnet und ausgefüllt.



> Und dies dann so ist, sind die die beiden folgenden Anweisungen immer false


Nach dem berechnen ist das Programm "Beendet" bzw. der Nutzer drückt auf Löschen und rechnet neu.

Gruß


----------



## Fabio Hellmann (4. Oktober 2011)

Also mit Integer-Werten kann es deshalb nicht funktionieren, weil das nur Ganze-Zahlen sind, sprich 1, 2, 3, 4, etc.. Dadurch wird z.B. dein Wert von 0.3617 auf 0 abgerundet. Deshalb sagt das Programm dir dann auch, dass du durch 0 teilen willst, was - wie wir ja alle wissen - nicht geht.
Aber so ohne Zwischenausgabe den Fehler zu finden ist schwer. Ich sehe zumindest keinen.

Und verwende statt Math.rint(...):

```
double wert = (double) (Math.round(wert*100)/100.0);
```


----------



## korona (4. Oktober 2011)

So, ich habe das mit System.out.println ausprobiert und es funktioniert.
Es geht wirklich um die Anzeige in den JTextFiel.

Bsp 1
text1 = 1 geteilt durch text2 = 100 wird im Fenster angezeigt Bildgröße 0.0 (vorher 1) und Gegenstandsgröße NaN (vorher 100) das Ergebnis JTextField Abbildungsmaßstab 0.0.
Mit System.out.println funktionierts.

Bsp 2
text2 = 500 mal text3 = 50 wird nichts berechnet. Mit System.out.println funktionierts.

Dazu erhalte ich noch diese Fehlermeldung (sind nur die ersten drei Zeilen)


> Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
> at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:989)
> at java.lang.Double.parseDouble(Double.java:510)


----------



## Fabio Hellmann (4. Oktober 2011)

Also diese Exception wird ja nur dann geschmissen, wenn eines der Textfelder nicht ausgefüllt ist.
Du solltest bei deiner If-Bedingung vielleicht nicht abfragen .isEmpty(), sondern:

```
text1 != null && text1.length() > 0
```
Und das für die anderen eben auch.


----------



## korona (5. Oktober 2011)

Hi, 
funktioniert nicht es wird mit ein Fehler angezeigt.
	
	
	



```
.length()
```
 wird garnicht als Opton für die Textfelder akzeptiert.
Gruß


----------



## Fabio Hellmann (5. Oktober 2011)

Oh sorry, ich hab es ein wenig falsch bzw. zu kurz geschrieben.

```
String text = textField.getText();
if(text != null && text.length() > 0) {

}
```

So müsste es richtig sein


----------



## korona (6. Oktober 2011)

Hab es ausprobiert. Ich bekomme ncoh immer die Exception in thread ... angezeigt.

Habe mit Kommentierung ausprobiert und entdeckt:


> Bsp 1
> text1 = 1 geteilt durch text2 = 100 wird im Fenster angezeigt Bildgröße 0.0 (vorher 1) und Gegenstandsgröße NaN (vorher 100) das Ergebnis JTextField Abbildungsmaßstab 0.0.
> Mit System.out.println funktionierts.


Wenn ich die anderen if-Anweisungen auskommentiere dann funktioniert es.
Vieleicht liegt der Feher dann doch auch in den Anweisungen****?


----------

