JTextField() Werte werden nicht übernommen und berechnet

korona

Mitglied
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ß

Code:
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)

Code:
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;
    }
    
}
 
Zuletzt bearbeitet:
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 :confused:

Gruß
Klaus
 
Hi,

hier sind die Zeilen. Die ersten beiden bekommen den Wert durch
Code:
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
 
Moin,

oh, nein - da liegst Du falsch !

Mit
Java:
b = text1.getText();
wird nur ein Inhalt des Textfeldes text1 ausgelesen.

Es muss aber auch zuvor gefüllt werden!
Bspw.:
Java:
text1.setText( "Mein Text");

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

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

Gruß
Klaus
 
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.
PHP:
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.
PHP:
if (text1.getText().isEmpty() == false && text2.getText().isEmpty() == false)
 
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
 
Zuletzt bearbeitet:
Hi,

mach doch immer nach deinem Calc-Aufruf mal eine Ausgabe, um das Zwischenergebnis zu überprüfen.
Java:
wert = Optikformeln.calc...(<parameter>, <parameter>);
System.out.println("Wert = " + wert);

Gruß

Fabio
 
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ß
 
Zuletzt bearbeitet:
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(...):
Java:
double wert = (double) (Math.round(wert*100)/100.0);
 
Zuletzt bearbeitet:
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)
 
Zuletzt bearbeitet:
Zurück