Berechnung in die start und paint Methode eines Applets

OnDemand

Top Contributor
Hallo zusammen so langsam verzweifel ich 🙁
Ich habe eine Aufgabe gehabt in welcher ich einen Mittelwert errechnen sollte siehe Code.

Nun ist eine Folgeaufgabe, welche fragt, was passiert:

a)wenn die Berechnung in einer Paint Methode und was wenn sie in einer
b)Start Methode des Applets eingebaut wird
c)und unter welchen Bedingungen die Berechnungen durchgeführt werden.

Ich hab hier im Forum schon selbe Aufgaben gefunden, aber irgendwie sind die Lösungsvorschläge dennoch verwirrend.

ich habe zu a) In der Startmethode kann nicht berechnet werden, da die Start-Methode direkt nach Aufruf des Applets aufgerufen wird und so noch keine Daten eingegeben sind. Es folgt die Exception dass Strings erwartet werden in der Eingabe.
Ergo; man kann nicht rechnen in der Startmethode, es sei denn man gibt den Variablen, welche zur Berechnung sind einen startwert an.

zu b) man kann in der paint-Methode die berechnung durchführen, da es dann eine überschriebene Methode der paint-methode aus der Klasse java.applet.Applet ist (?).
Bedingung: Die paint methode muss eine andere Signatur aufweisen, als die Paint-Methode aus java.applet.Applet

Mein Tutor lacht sich schon schlapp über meine Doofheit ^^

Er schreibt: Sie liegen daneben, Machen Sie erst folgendes:

- schreiben Sie eine paint- und eine start-Methode, und geben dort mit einem System.out aus:
"Start aufgerufen"

bzw.

"Paint aufgerufen"

Machen Sie dann so einige Dinge mit Ihrem Applet, so dass die Ausgabe erscheint.
Aber bitte, rufen Sie die beiden Methoden auf keinen Fall manuell auf.


Versteh die ganze Aufgabe nicht. Zumal mir gesagt wurde, dass diese Aufgabe keinen Sinn macht, weil so niemand programmiert...

Ich hoffe mir kann jemand eine tolle Erklärung geben, damit ich das raffe 🙁

Hier mein Code
Java:
import java.applet.*;
import java.awt.*;

public class Mittelwert extends Applet {

	Label labText1;
	TextField tfWert1, tfWert2, tfErgebnis;
	Button bRechne, bLoeschen;
	Font fntHead, fntFett;

	public void init() {

		setLayout(null);

		fntHead = new Font("Verdana", 1, 14);
		fntFett = new Font("Verdana", 1, 12);

		// Überschrift
		labText1 = new Label("Das Applet berechnet Mittelwerte");
		labText1.setBounds(30, 10, 300, 25); // x, y, b, h
		labText1.setFont(fntHead);
		add(labText1);

		// 1. Wert
		tfWert1 = new TextField("");
		tfWert1.setBounds(30, 50, 150, 25);
		add(tfWert1);

		// 2. Wert
		tfWert2 = new TextField("");
		tfWert2.setBounds(200, 50, 150, 25);
		add(tfWert2);

		// Button "Rechne Mittelwert"
		bRechne = new Button("Rechne Mittelwert");
		bRechne.setBounds(120, 90, 150, 25);
		bRechne.setFont(fntFett);
		add(bRechne);

		// Ergebnisfeld
		tfErgebnis = new TextField("");
		tfErgebnis.setBounds(120, 130, 150, 25);
		add(tfErgebnis);

		// Button "Loeschen"
		bLoeschen = new Button("Loeschen");
		bLoeschen.setBounds(120, 170, 150, 25);
		bLoeschen.setFont(fntFett);
		add(bLoeschen);
	}
/*
	public boolean handleEvent (Event e) {

		if(e.target == bRechne && e.id == Event.ACTION_EVENT) {
			start();
		}

		if(e.target == bLoeschen && e.id == Event.ACTION_EVENT) {
			loeschenClicked();
		}

		return false;
	}*/

	public void start() {
		float wert1 = Float.parseFloat(tfWert1.getText());
		float wert2 = Float.parseFloat(tfWert2.getText());
		float ergebnis = ((wert1 + wert2) / 2);
		tfErgebnis.setText(Float.toString(ergebnis));
	}

	public void loeschenClicked() {
		tfWert1.setText("");
		tfWert2.setText("");
		tfErgebnis.setText("");
	}
}
 
Der Tutor hat bereits die korrekte Antwort geschrieben.

Implementiere die beiden Methoden und schreib da ein SysOut rrein.
 
Hi,

ja aber wie rufe ich die Methode nicht manuell auf (sondern automatisch)?

Ich habe :

Java:
public void start() {
System.out.println("startmethode");
}

Das ist aber manuell aufgerufen?!

😛opcorn:
 
aber wenn ich mein Applet aufrufe, kommt NIX im Applet 🙁

und als ich meinem Tutor schrieb, wie ich die Methode aufrufe (siehe Code oben) sagt er: Sie sollen die Methoden eben nicht selbst aufrufen.

häää? Ich weis, dass die Start-Methode vom Applet selber aufgerufen wird..aber wie bekomme ich dann da ein sysout rein?
 
ja aber wie rufe ich die Methode nicht manuell auf (sondern automatisch)?

Gar nicht. Bei einem Applet macht das der Browser. Deshalb lacht sich dein Tutor schlapp.
Das Applet durchläuft einen Lebenszyklus.
1. init() - einmal mit dem Laden des Applets
2. start() - Applet geladen, Objekte initialisiert, außerdem jedesmal, wenn du zu dieser Seite zurückkehrst
3. stop() - beim Verlassen der Webseite, oder beim Aus-dem-Sichtbarkeitsbereich-Scrollen im Browser
4. destroy() - beim Beenden des Browsers.

Das sind Applet-Grundlagen, die findet man in jedem Einsteigerbuch.
Den Sysout gibts auf der Java-Console, nicht im Applet.
 
@L-ectron-X ganz genau, das sag ich ja auch, ich weis dass diese Methoden automatisch aufgerufen werden. Aber wie kann ich in der Startmethode eine Berechnung einfügen? (So wie die Aufgabe a sie #1 ist und unter welcher Bedingung wird diese ausgeführt)

Weis nicht warum uns solch sinnfreie Aufgaben gegeben werden, die sowieso niemand programmiert...bringt irgendwie nur noch mehr Fragen und Verwirrtheit auf 🙁

Die Antwort kann doch nicht sein, dass man damit nicht rechnen kann, weil die Methoden automatisch aufgerufen werden oder?????

Dann flipp ich aber echt aus ;(
 
Die Antwort kann doch nicht sein, dass man damit nicht rechnen kann, weil die Methoden automatisch aufgerufen werden oder?????

Die eine Methode wird nur einmal aufgerufen, noch bevor der Zustand erreicht ist, in dem man rechnen kann ==> NPE, falsche ausgabe

Die andere Methode rechnet viel zu oft und noch nichtmal kontrolliert.

Hättest dud as korrekt gemacht, würdest du genau das sehen.

Ich stehe neben deinem Tutor und lache mich schlapp.
 
Ich hoffe, ich habe dich richtig verstanden, weil das wirklich etwas verwirrend geschildert ist.

Die start()-Methode kann nur dann eine Berechnung durchführen, wenn Werte aus den Textfeldern ausgelesen werden können.
Normalerweise werden die Werte ja erst zu Laufzeit eingegeben und nach einem Button-Klick ausgelesen und berechnet.
Du kannst aber in der init()-Methode bereits Werte an die Textfelder übergeben, so dass diese bereits mit Inhalten initialisiert werden und somit in der start()-Methode gültige Werte ausgelesen werden können.

In der paint()-Methode kann nichts berechnet werden, weil diese nur das Applet zeichnet und mit GUI-Komponenten, die auf der Oberfläche des Applets eingebaut sind, nichts direkt zu tun hat.
Die paint()-Methode kann u.U. sehr oft aufgerufen werden. Z.B. beim Scrollen der Webseite.

[EDIT]Korrektur:
In der paint()-Methode kann auch gerechnet werden.
Im Prinzip führst du eine paint()-Methode ein (überschreiben) und dort hinein den gleichen Quelltext, wie er in der start()-Methode steht.
die Ausgabe muss dann allerdings etwa so aussehen, wenn das Ergebnis auf der Applet-Fläche ausgegeben werden soll:
Java:
g.drawString(""+ergebnis, 10, 10);
Wenn nicht, wird das Ergebnis auch dann im Textfeld ausgegeben. Eine Konsolenausgabe wäre auch denkbar.[/EDIT]

Deinem Tutor kannst du aber auch um die Ohren hauen, dass er das veraltete Event-Model verwendet... 😱
Und "NullLayout" geht auch gaaar nicht...
 
ich weis ja eben nicht, wie ich die beiden Methoden ansprechen muss, damit ich die NPE bekomme und in der Paint-Methode rechnen kann 🙁

(ich soll ja die Methoden nicht mit o.g. Code aufrufen)
 
Hallo L-ectron-X, na das nenne ich mal Hilfe, vielen Dank!

Ich habe meinem Tutor schon mal geschrieben:

Wenn die Berechnung in der Start-Methode aufgerufen wird, wird die Berechnung mif Öffnung des Applet ausgeführt - ohne das Daten zum Berechnen vorhanden sind? D.h. es gibt eine Fehlermeldung, dass keine Daten vorhanden sind um rechnen zu können?
Nun kommt noch die Bedingung dazu: in der init-Methode kann ich werte an die Variablen geben, damit Werte vorhanden sind und keine Exception kommt.

b) In der paint-Methode kann ich nicht rechnen, da diese nur Objekte zeichnet und mit den GUI-Komponenten nix zu tun hat (und diese nicht ansprechen kann?)

Die alten Event-Handlings sind wohl bewusst gewählt, ist das so alt ?:

Java:
public boolean handleEvent (Event e) {

		if(e.target == bRechne && e.id == Event.ACTION_EVENT) {
			start();
		}

		if(e.target == bLoeschen && e.id == Event.ACTION_EVENT) {
			loeschenClicked();
		}

		return false;*/
	}
 
Ja, das ist das Event Handling aus Java 1.0
Heute wird größtenteils das Delegation Modell (Listener Konzept) aus Java 1.1 benutzt.
Ich habe oben noch mal editiert. Eine Berechnung in der paint()-Methode ist natürlich auch möglich.
Aber wie gesagt, so wird das aber nie gemacht werden.
 
Wir fangen anscheinend erstmal mit den ultimativen Basics an, wo auch Java angefangen hat^^


Eins noch, wie lautet denn der korrekte Code, dass ich die NPE auch zu gesicht bekomme? 😱
Dann werd ich mal meinen aktuellen Wissensstand an meinen Tutor übermitteln, vielen Dank nochmals!
 
Ähm sorry. Du willst eine NPE sehen?
Wenn du den Code so lässt, solltest du eine [JAPI]NumberFormatException[/JAPI] bekommen, denke ich.

Mit:
[JAVA=25]tfWert1 = new TextField("0");[/code]
[JAVA=30]tfWert2 = new TextField("0");[/code]
sollte keine Exception geworfen werden und das Applet funktionieren.
 
Was ich noch nicht kapiere: Der Berechnungscode muss so aussehen??? (Wenn er in die Startmethode soll)

Java:
public void start() {
		float wert1 = Float.parseFloat(tfWert1.getText());
		float wert2 = Float.parseFloat(tfWert2.getText());
		float ergebnis = ((wert1 + wert2) / 2);
		tfErgebnis.setText(Float.toString(ergebnis));
	}
Da hat mein Tutor gesagt, dass ich die Methode nicht manuell zur Berechnung aufrufen soll...Ja aber irgendwie muss ich doch die Methode aufrufen, damit ich rechnen kann :autsch::autsch:
 
Oh man 🙁

Ich weis, dass start() automatisch aufgerufen wird, aber wie sieht denn der Code aus, wenn ich (lt. Aufgabe) die Berechnung in die Startmethode des Applets packen soll😳
 
Ist doch schon alles fertig. In deinem Eingangsposting brauchst du nur die Textfelder tfWert1 und tfWert2 mit einer Ziffer initialisieren. Das habe ich auch bereits oben geschrieben.
Dann läuft das Applet, ohne Fehlermeldung.
Was noch fehlt, wäre die paint()-Methode lt. Aufgabe. Habe ich auch bereits was dazu geschrieben.

Also, trink noch mal ein Kaffee, lies die entsprechenden Postings und dann kommst du drauf. 😉

Ach, und so siehts im Appletviewer aus:
 

Anhänge

  • Mittelwert.png
    Mittelwert.png
    7,5 KB · Aufrufe: 44
Jetzt hab ich es 🙂...fast...noch eine Frage. Wenn ich die Berechnung in die Paint() Methode schreibe, warum kommt da keine Fehlermeldung, dass "kein String vorhanden ist"?
 
Weil vermutlich ein String vorhanden ist.
Warum man nicht in der paint rechnet hat weniger was mit "nicht können" zutun, sondern eher mit "nicht sollte".
Die Paint ist genau dafür da wie ihr Name schon sagt, zum "Zeichnen".
Sie nimmt nur alle >>FERTIGEN<< Daten und zeichnet diese.
Alles berechnen solltest du entweder in einer anderen update-Methode (falls natürlich ständig Daten neu berechnet werden müssen wie bei Spielen z.B., das Thema werdet ihr warscheinlich viel viel später lernen) oder aber gleich beim handeln des Click-Events.
 
Die Aufgabe lautet aber nunmal, was passiert wenn die Berechnung in der paint() steht und unter welchen Bedingungen diese durchgeführt wird.

Und es ist kein String vorhanden, deshalb wunder ich mich ja, warum keine Exception kommt, wie bei der Variante "Berechnung in start()"
 
Die Aufgabe lautet aber nunmal, was passiert wenn die Berechnung in der paint() steht und unter welchen Bedingungen diese durchgeführt wird.
Was Passiert? Du nutzt die paint "aus", um Berechnungen auszuführen. Bei Rechenintensiven berechnungen hängt sich das Applet auf, bis die Berechnung fertig ist.
Die paint() wird immer dann aufgerufen, wenn entweder das Applet meint dass es notwendig ist (sich also etwas ändert wie z.B. resize, Button-Click um den "eingedrückten" Button zu zeichnen) oder du selbst ein repaint() anforderst weil sich eben deine Daten geändert haben und diese nun aufs Applet übertragen werden sollen.
 
Hi, also heißt das, dass jedesmal wenn ich das Applet aktualisiere oder oder oder, die Berechnung in der paintmethode durchgeführt wird unabhängig davon, ob der Button "berechne" geklickt wurde
 
Das ist korrekt, weil es nichts zu zeichnen gibt und das
TKausL hat gesagt.:
...Button-Click um den "eingedrückten" Button zu zeichnen...
so nicht stimmt.
Wenn du das Applet mal mit dem Appletviewer startest und dann mal am Appletviewer-Fenster ziehst, wirst du sehen, dass die paint()-Mehode aufgerufen wird.

wie du den Appletviewer startest?
Mach dir eine Eingabeaufforderung/Terminal/Konsole auf, navigiere zum Speicherort deinr HTML-Datei und gibt dann ein:
Code:
appletviewer MeineSeite.html
 

Neue Themen


Zurück
Oben