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 Euro

    Woran 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 Euro

    Versuch 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?


  • Mod

    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 😞


Anmelden zum Antworten