Problem miT JOptionPane

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi,

ich habe folgenden Code:
Code:
button1.addActionListener(new ActionListener()
{	
	public void actionPerformed(ActionEvent ae)	
	{
		df = new DecimalFormat("#.##");
		try//Dialogboxen wären besser statt diese langen Sätze
		{ 
			 t = textfeld.getText();
			 int e = Integer.parseInt(t);
			 
					 if(e < 0 | e == 0)			 
					 {
						 JOptionPane.showMessageDialog(null, "Bitte");
//						 textfeld2.setText("Bitte einen Wert größer Null eingeben!!");				 	 
					 }
					 else
							{
							 textfeld2.setText(t + " KW entsprechen: " + df.format(f2(e)) + " PS");		
		//					 textfeld2.setBackground(Color.red);
							}
					 
				if(e > 999)
					 {
						 textfeld2.setText("Bitte einen Wert kleiner 1000 eingeben");
					 }					 
					 else
						{
						 textfeld2.setText(df.format(f2(e)) + " PS");		
		//				 textfeld2.setBackground(Color.red);
						};
				
				
					
		}
						catch(NumberFormatException a)
							{
							textfeld2.setText("Bitte nur Zahlen eingeben, sonst schwerer Ausnahmefehler");
		
							}
						}
		});

Mein Problem:
Wenn ich einen Wert "<= 0" berechnen möchte soll eine Meldung erscheinen, in Form einer Messagebox,
dass das nicht geht. So weit klappt es auch aber wenn ich die Messagebox bestätige, springt das Programm in die Zeile 29, auch wenn Zeile 15 nicht auskommentiert ist ???:L

Ohne JOptionPane wird problemlos bei einer Eingabe "<=0" immer die Zeile 15 angezeigt.

Danke für eure Hilfe

monet
 
Ich hab´s geschaft. Habe es schon herausgefunden.

Wenn ich die Zeile 29 aukommentiere klappt alles. 😀
Aber da stellt sich für mich die Frage, warum dann??

Ok, "<=999" ist "-2" auch aber warum reagiert das Programm nicht schon auf das erste if in Zeile 12?? ???:L

Danke,

monet
 
Es springt in Zeile 23 (denn das ist das nächste Statement nach dem ersten if), und dann in Zeile 29, weil e <= 999
Hier ist eine mögliche Lösung:
Code:
       button1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                df = new DecimalFormat("#.##");
                try {
                    t = textfeld.getText();
                    int e = Integer.parseInt(t);
                    if (e < 0 || e == 0) {
                        JOptionPane.showMessageDialog(null, "Bitte einen Wert größer Null eingeben!!");
                    } else if (e > 999) {
                        JOptionPane.showMessageDialog(null, "Bitte einen Wert kleiner 1000 eingeben");
                    } else {
                        textfeld2.setText(df.format(f2(e)) + " PS");
                    }
                } catch (NumberFormatException a) {
                    JOptionPane.showMessageDialog(null, "Bitte nur Zahlen eingeben, sonst schwerer Ausnahmefehler");
                }
            }
        });
 
Danke,

ich habe es ein wenig anderes gemacht, aber nur nicht so kompackt wie.
(Ich sollte also lieber schachteln)


André Uhres hat gesagt.:
Es springt in Zeile 23 (denn das ist das nächste Statement nach dem ersten if)
Muss er aber nicht schon auf die erste if-Anweisung reagieren, anstatt gleich zur zweiten springen,
denn "-5", ist doch "< 0". ???:L

Deshalb sollte doch das erste if ausgeführt werden, oder nicht???

Gruß monet
 
Es sind beide IFs erfüllt und deshalb werden auch beide
textfeld2.setText(...) Anweisungen ausgeführt.

Und da Java nicht stehenbleibt, um die GUI zu ändern, sondern
alle Änderungen im E(vent D(ispatch T(hread erst dann macht,
wenn deine actionPerformed - Methode vollständig abgelaufen ist,
führst du faktisch folgende Anweisungen aus.

Code:
textfeld2.setText("Bitte einen Wert größer Null eingeben!!"); 
textfeld2.setText(df.format(f2(e)) + " PS");   

...

// Erst jetzt kommt der EDT dazu die setText-Anweisungen auch zu visualisieren

Im Prinzip also nichts anderes als

Code:
int zahl;
zahl = 55;
zahl = 42;
System.out.println(zahl);


Hier wird auch nur 42 ausgegeben und nicht 55
 
Hi,

Leroy42 hat gesagt.:
Es sind beide IFs erfüllt und deshalb werden auch beide
textfeld2.setText(...) Anweisungen ausgeführt.

Ich habe gedacht, wenn die erste if-Anweisung erfüllt ist wird auch nur diese ausgeführt, egal wie
viele if-Anweisungen noch kommen.
Also wird eigentlich das Programm immer zuerst durchlaufen und dann wird es sozusagen ausgeführt.
Sehe ich das richtig :?:
Und bei mir waren ja beide if-Anweisungen eigentlich erfüllt.

Bin eben ein Newbie :autsch:

Gruß monet
 
Anonymous hat gesagt.:
Ich habe gedacht, wenn die erste if-Anweisung erfüllt ist wird auch nur diese ausgeführt, egal wie
viele if-Anweisungen noch kommen.

Falsch! Es wird jede IFAnweisung ausgeführt. Deshalb gibt es ja auch
den else-Teil in einer IF-Anweisung.

Anonymous hat gesagt.:
Also wird eigentlich das Programm immer zuerst durchlaufen und dann wird es sozusagen ausgeführt.
Sehe ich das richtig :?:

:shock:

Es wird während des Durchlaufens ausgeführt. Durchlaufen bedeutet ja ausführen,
allerdings wird die Methode setText(...) (und alle anderen die GUI betreffenden)
erst sichtbar, sobald die actionPerformed-Methode vollständig
ausgeführt wurde.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben