Von (komischer) Schreibweise bis Integer -> Float
-
Ich lerne Java hauptsächlich in der Schule und kenne mich daher nur beschränkt in
Java aus (mich reizt Java nicht deshalb befasse ich mich zuHause auch nur wenig damit).Wir haben heute in der Schule folgendes geschrieben:
BnKaffe.addActionListener (new ActionListener () { public void actionPerformed (ActionEvent e) { anz_kaffe++; LbKaffe.setText (anz_kaffe + " Kaffe"); } });
Ich verstehe nicht, weshalb dieser Codeblock in den Methodenaufruf kommt, geht
das auch in 2Schritten? Ich persönlich mag das so überhaupt nicht.Nun mein zweites Problem, das ganze ist ein InternetCafe bzw. soll eines sein,
man kann dort kaffee und bier kaufen, indem man auf den Button klickt, dadurch
wird durch solch ein Event wie oben die Anzahl um 1 erhöht.
Klickt man auf bezahlen, führe ich folgende Rechung durch und gebe das Ergebnis aus:rechnung = anz_bier/2 + anz_kaffe/2; // preise betragen 50Cent daher /2 LbRechnung.setText (rechnung + " Euro");
Rechnung ist vom Typ float die anderen beiden Integer, normal müsste das doch
zu float konvertiert werden und das Ergebnis richtig angezeigt werden.
Aber das Ergebnis stimmt oft nicht, so als ob ich noch mit Integern rechne.
z.b. 1Bier+1kaffe macht 0.0 EuroWoran kann das liegen?
Da ich heute Nachmittag nicht da bin und euch Infos geben kann, hier mal der
gesamte Quellcode:import java.awt.*; import java.awt.event.*; import java.applet.*; public class ICafe extends Applet { int anz_kaffe = 0; int anz_bier = 0; float rechnung = 0; // Labels Label LbKaffe = new Label ("Kaffe"); Label LbBier = new Label ("Bier"); Label LbRechnung = new Label (); // Buttons Button BnKaffe = new Button ("Kaffe 0,50"); Button BnBier = new Button ("Bier 0,50"); Button BnRechnung = new Button ("Zur Kasse"); public void init() { setLayout (new GridLayout (3,2,10,5)); add (BnKaffe); add (LbKaffe); add (BnBier); add (LbBier); add (BnRechnung); add (LbRechnung); BnKaffe.addActionListener (new ActionListener () { public void actionPerformed (ActionEvent e) { anz_kaffe++; LbKaffe.setText (anz_kaffe + " Kaffe"); } }); BnBier.addActionListener (new ActionListener () { public void actionPerformed (ActionEvent e) { anz_bier++; LbBier.setText (anz_bier + " Bier"); } }); BnRechnung.addActionListener (new ActionListener () { public void actionPerformed (ActionEvent e) { rechnung = anz_bier/2 + anz_kaffe/2; LbRechnung.setText (rechnung + " Euro"); } }); } public void paint(Graphics g) { //g.drawString("Welcome to Java!!", 50, 60 ); } }
-
SirLant schrieb:
Wir haben heute in der Schule folgendes geschrieben:
BnKaffe.addActionListener (new ActionListener () { public void actionPerformed (ActionEvent e) { anz_kaffe++; LbKaffe.setText (anz_kaffe + " Kaffe"); } });
Ich verstehe nicht, weshalb dieser Codeblock in den Methodenaufruf kommt, geht
das auch in 2Schritten? Ich persönlich mag das so überhaupt nicht.Sicher geht das auch in zwei Schritten nur müsstest du dann eine dedizierte Klasse (ActionListener) haben den du der Methode addActionListener zuweist. Eine andere Möglichkeit wäre die Hauptklasse als ActionListener anzugeben (Interface ActionListener implementieren!) und als Parameter für die obige Methode "this" zu verwenden.
Rechnung ist vom Typ float die anderen beiden Integer, normal müsste das doch
zu float konvertiert werden und das Ergebnis richtig angezeigt werden.
Aber das Ergebnis stimmt oft nicht, so als ob ich noch mit Integern rechne.
z.b. 1Bier+1kaffe macht 0.0 EuroVersuch eine der Variablen auf einen float zu casten:
[java]rechnung = ((float)anz_bier)/2 + anz_kaffe/2;[]/java]
damit müsste es dann klappen.
-
Ok, das leuchtet ein, wenn ich Privat mit solchen Events arbeite bzw. es als
Extra in die programme einbaue, verwende ich auch immer die Interfaces und übergebe
this.
habe nur nicht gewusst, dass es auch so geht.Werde das mit der Typumwandlung mal versuchen.
Danke
Edit:
Mit einem float cast berechnet er nur den einen richtig, den anderen nicht, so
geht es aber:rechnung = (float)anz_bier/2 + (float)anz_kaffe/2;
-
Ja so geht das auch. Dabei wird eine sog. anonyme Klasse erzeugt, die du auch nach dem Compilevorgang sehen kannst. Häufig heißen diese Klassen <Klassenname>$<Zahl>.class
-
Eine Sache aber habe bisher noch nie mit mehreren Events gearbeitet, wie muss ich
das ganze ändern, wenn ich das Interface benutze, so dass er immer nur das betreffende
Label aktualisiert?
-
SirLant schrieb:
Wir haben heute in der Schule folgendes geschrieben:
BnKaffe.addActionListener (new ActionListener () { public void actionPerformed (ActionEvent e) { anz_kaffe++; LbKaffe.setText (anz_kaffe + " Kaffe"); } });
Ich verstehe nicht, weshalb dieser Codeblock in den Methodenaufruf kommt, geht
das auch in 2Schritten? Ich persönlich mag das so überhaupt nicht.Hier wird eine anonyme innere Klasse genutzt. An die Notation solltest du dich besser gewöhnen, da sie in Javacode (besonders bei GUIs) durchaus häufig anzutreffen ist. Natürlich kannst du das auch anders schreiben. Du kannst zum Beispiel statt einer anonymen inneren Klasse eine ganz normale Klasse schreiben und ein Objekt dieser Klasse der Methode übergeben. Das ist aber noch viel mehr unnötiger Overhead. Bei einfachen Fällen mache ich es meistens so, dass ich bei der Klasse, die die Methode aufruft, das Interface ActionListener implementiere und dann "this" übergebe.
Rechnung ist vom Typ float die anderen beiden Integer, normal müsste das doch
zu float konvertiert werden und das Ergebnis richtig angezeigt werden.Nein. Warum sollte hier so früh gecastet werden. es wird erst ein float bei der Zuweisung an Rechnung benötigt, also wird auch erst dann nach float gecastet. Wenn du während der Berechnung mit floats rechnen möchtest, dann mußt du explizit die ints in floats casten.
EDIT: ...da war Cengiz wohl (viel) schneller!
-
Könnte mir wer das Programm zu umschreiben, dass die Klasse die ActionListener
Schnittstelle implementiert und verwendet für die 3Aktionen?
Ich weiß ehrlich gesagt nicht wie ich das machen soll