Programmierung von BlueJ

N

noah_1492

Mitglied
Ich bin aktuell in der 10. Klasse auf dem Gymnasium und wir haben in Informatik nun angefangen auf das Programm BlueJ umzusteigen(Art Java). Nun haben wir die Aufgabe bekommen ein Programm zu erstellen, wo ein Ballon(Kreis) zu sehen ist, der immer größer wird und schließlich am Ende platzt. Nach dem Platzen erscheint der Text "PENG". Zuerst soll ein roter Kreis auf einem gelben Hintergrund erscheinen. Dieser soll gleichmäßig größer werden und wenn er den Rand berührt platzen. Danach soll auf einem gelben Hintergrund mit grüner Schrift PENG stehen. Leider komme ich nun nicht mehr weiter. Kann mir einer vielleicht helfen? Besondere Probleme liegen dabei den Kreis zu vergrößern und einen schlichten Hintergrund zu erstellen. Das ist mein bisheriger Code:

Java:
/**
* Das Programm bringt einen Ballon zum Platzen.
*
* @author (Noah)
* @version (5.10.20)
*/
import sas.*;
import java.awt.Color;
class BallonPlatzen
{
View view;
Circle ballon;
int x = 0;
int y = 0;
int r = 50;
BallonPlatzen()
{
view = new View();
this.konstruiereBallon();
this.aufblasenBallon();
this.platzenBallon();

}

void konstruiereBallon() {
ballon = new Circle(x = 250, y = 145, r= 50, Color.RED);
}

void aufblasenBallon() {
if(ballon.contains(view)) {

view.remove(ballon);
x = x - 10;
y = y - 10;
r = r + 10;
ballon = new Circle(x, y, r, Color.RED);
}
}

void platzenBallon() {
Text(250, 250, "PENG");
}
}
 
mihe7

mihe7

Top Contributor
Mal als kleine Hilfe:
Java:
    void aufblasen() {
        for (int i = 100; i < 150; i++) {
            ballon.scale(1.1, 1.1); // 10 % Zuwachs
            view.wait(50);
        }
    }
 
B

BestGoalkeeper

Bekanntes Mitglied
nun angefangen auf das Programm BlueJ umzusteigen(Art Java)
BlueJ ist eine Art Entwicklungsumgebung (IDE) zur Entwicklung von Programmen in Java. (damit hab ich auch angefangen)
Leider komme ich nun nicht mehr weiter. Kann mir einer vielleicht helfen? Besondere Probleme liegen dabei den Kreis zu vergrößern und einen schlichten Hintergrund zu erstellen. Das ist mein bisheriger Code
Woran hapert es genau und was hast Du schon versucht?
 
N

noah_1492

Mitglied
Bis jetzt gelingt alles. Bis auf das der Ballon zum Schluss nicht verschwinden will. Bei remove steht der Fehler: keine Variable vorhanden. Außerdem weiß ich nicht wie ich die Schriftgröße bei PENG ändern kann. Sonst ist meiner Ansicht nach alles so gut, oder? Das ist mein bisheriger Code:
Java:
/**
 * Das Programm bringt einen Ballon zum Platzen.
 * 
 * @author (Noah) 
 * @version (5.10.20)
 */
import sas.*;
import java.awt.Color;
class BallonPlatzen
{
    View view;
    Circle ballon;
    Text text;
    Rectangle hintergrund;
    int x = 0;
    int y = 0;
    int r = 0;
    void main()
    {
        view = new View();
        this.hintergrund();
        this.konstruiereBallon();
            while(y>0) { 
                this.aufblasenBallon();
            }
       this.platzenBallon();
      
    }
    
    void hintergrund(){
    hintergrund = new Rectangle (0, 0, 600, 500, Color.YELLOW);
    }
    void konstruiereBallon() {
    ballon = new Circle(x = 250, y = 145,  r= 50, Color.RED);
    }
    
    void aufblasenBallon() {
            x = x - 10;
            y = y - 10;
            r = r + 10;
            ballon =  new  Circle(x, y, r, Color.RED);
            view.wait(1000);
        }
    void platzenBallon() {
    remove(Circle.ballon);
    text = new Text(150,250, "PENG", Color.GREEN);
   }
}
 
N

noah_1492

Mitglied
Diesen Download habe ich schon, aber das funktioniert troztdem nicht
Wenn ich das so schreibe remove(ballon);
Dann kommt die Fehlermeldung:
cannot find symbol - methode remove (sas.Circle)
 
K

kneitzel

Top Contributor
Ich würde Dir empfehlen, dir einfach einmal die Dokumentation der sas Bibliothek anzusehen.

Beim ganz schnellen Überfliegen fällt mir z.B. auf, dass View eine remove Methode hat, um ein shape zu entfernen. Und ein Circle ist ein Shape, daher dürfte dies wohl die notwendige Methode sein.
 
N

noah_1492

Mitglied
Java:
void platzenBallon() {
    remove(Circle);
    text = new Text(150,250, "PENG", Color.GREEN);
   }
   void remove(Circle.ballon){
    remove(circle);
    }
Bei void remove(Circle.ballon) steht der Fehler identifier expected
Was genau ist da schuld?
 
N

noah_1492

Mitglied
habe bisschen herumprobiert. Nun komme ich hier rauf:
Java:
void remove(){
   remove(Circle.ballon);
    }
Da zeigt das Programm an cannot find symbol - variable ballon
 
K

kneitzel

Top Contributor
Also dieses wild rumprobieren wird Dich nicht zum Ziel bringen (außer jemandem geht die Geduld aus und gibt die richtige Lösung ... aber dann ist der Lerneffekt gleich Null!).

Also erst einmal die Frage, was die einzelnen Dinge sind bzw. wären:

a) Circle - das ist einfach nur eine Klasse. Als Parameter taugt es also absolut nichts. Eine Klasse nur über den Namen kann man nicht übergeben. (sprich: remove(Circle) ist Quatsch!)
b) Circle.ballon - Circle ist eine Klasse haben wir bei a) gesagt. Klassenname.Variablenname wäre das Ansprechen einer Klassenvariable. Hat die Klasse Circle eine statische Variable (= Klassenvariable) ballon? Nein? ==> Also ist remove(Circle.ballon) Quatsch.
c) remove(...) -> Das ist ein Methodenaufruf. Und wenn da nur so der Name der Methode geschrieben steht, dann bedeutet dies, dass im Kontext (das wäre bei einer Instanzmethode die aktuelle Instanz und bei einer Klassenmethode die Klasse) eine Methode remove ist, die aufgerufen werden soll. Hast Du in der Klasse BallonPlatzen, die Du geschrieben hast, eine Methode remove? Nein? ==> Aufruf ist somit Quatsch.

Ich hoffe, das ist etwas, das Du erst einmal nachvollziehen konntest. Bei jedem dieser Versuche meckert der Compiler mit einer Aussage. Das ist dann meist einfach eine Umschreibung auf Englisch. Kann man sich ansehen, aber erst einmal ist wichtig, dass man den Code versteht, sprich: Was habe ich da überhaupt hingeschrieben? Und dann das Verständnis, wieso das nicht funktioniert hat....

Du hast aber in BallonPlatzen:
Code:
    View view;
    Circle ballon;
    Text text;

Was ist View? Was ist Circle? Was ist Text? Das sind ja Klassen aus der Library, die Du verwenden willst. Was machen die aber? Was bilden die ab? Hast Du das verstanden?

Also schau Dir einmal die Dokumentation von sas an: http://www.dingemann.de/sas/DokumentationSaS.5.7.pdf
Da findest Du die Beschreibung, d.h. was für Klassen es gibt (View, Circle, ...) und was man damit alles machen kann...

Und bezüglich Deines Punktes "Außerdem weiß ich nicht wie ich die Schriftgröße bei PENG ändern kann." wirst Du bestimmt auch fündig, wenn Du Dir die Beschreibung von der Klasse Text anschaust.
 
B

BestGoalkeeper

Bekanntes Mitglied
Hab das mal installiert...
Java:
import sas.*;
import java.awt.Color;

public class BallonPlatzen {
    View view;
    Circle ballon;
    Text text;
    Rectangle hintergrund;
    int x = 250;
    int y = 145;
    int r = 40;

    void main() {
        konstruiereView();
        konstruiereHintergrund();
        konstruiereBallon();
        while (y > 0) {
            aufblasenBallon();
        }
        platzenBallon();
    }

    void konstruiereView() {
        view = new View();
    }

    void konstruiereHintergrund() {
        hintergrund = new Rectangle(0, 0, 600, 500, Color.YELLOW);
    }

    void konstruiereBallon() {
        ballon = new Circle(x, y, r, Color.RED);
    }

    void aufblasenBallon() {
        view.remove(ballon);
        x = x - 10;
        y = y - 10;
        r = r + 10;
        ballon = new Circle(x, y, r, Color.RED);
        view.wait(1000);
    }

    void platzenBallon() {
        view.remove(ballon);
        text = new Text(250, 200, "PENG!!!", Color.GREEN);
    }

    public static void main(String[] args) {
        BallonPlatzen ballonPlatzen = new BallonPlatzen();
        ballonPlatzen.main();
    }
}

Du musst/kannst view.remove(ballon); aufrufen.

Die Schriftgröße lässt sich übrigens nicht ändern:
Screenshot 2020-10-05 223346.png
 
B

BestGoalkeeper

Bekanntes Mitglied
außer jemandem geht die Geduld aus und gibt die richtige Lösung ... aber dann ist der Lerneffekt gleich Null
Kannst du auch etwas weniger pöbeln? Er hat offensichtlich an einer Stelle ein Problem, an der er ohne Hilfe nicht weiter kommt. Und langes BlaBla ohne Wissen hilft hier niemanden.
 
T

thecain

Top Contributor
Die Schriftgröße lässt sich übrigens nicht ändern:
Oder eben doch
void setFontMonospaced(boolean bold, int size)
Das Text -Objekt wird in einer nicht proportionalen Schrift in der angegebenen Punktgröße
ggf. fett auf der Zeichenfläche angezeigt.

void setFontSansSerif(boolean bold, int size)
Das Text-Objekt wird in einer serifenfreien Proportionalschrift in der angegebenen Punkt-
größe ggf. fett auf der Zeichenfläche angezeigt.

void setFontSerif(boolean bold, int size)
Das Text-Objekt wird in einer Proportionalschrift mit Serifen in der angegebenen Punktgröße
ggf. fett auf der Zeichenfläche angezeigt
Doku lesen ist halt doch keine schlechte Idee...
 
K

kneitzel

Top Contributor
Kannst du auch etwas weniger pöbeln? Er hat offensichtlich an einer Stelle ein Problem, an der er ohne Hilfe nicht weiter kommt. Und langes BlaBla ohne Wissen hilft hier niemanden.
Also Du pöbelst hier doch ganz offensichtlich. Wenn Du meinen Beitrag etwas weiter gelesen hättest, dann hättest Du konkrete Erläuterung gesehen und evtl. auch verstanden.

Die Schriftgröße lässt sich übrigens nicht ändern:
Was natürlich falsch ist. Schau Dir einfach einmal die Methode:
void setFontMonospaced(boolean bold, int size)
an.
 
N

noah_1492

Mitglied
Hab das mal installiert...
Java:
import sas.*;
import java.awt.Color;

public class BallonPlatzen {
    View view;
    Circle ballon;
    Text text;
    Rectangle hintergrund;
    int x = 250;
    int y = 145;
    int r = 40;

    void main() {
        konstruiereView();
        konstruiereHintergrund();
        konstruiereBallon();
        while (y > 0) {
            aufblasenBallon();
        }
        platzenBallon();
    }

    void konstruiereView() {
        view = new View();
    }

    void konstruiereHintergrund() {
        hintergrund = new Rectangle(0, 0, 600, 500, Color.YELLOW);
    }

    void konstruiereBallon() {
        ballon = new Circle(x, y, r, Color.RED);
    }

    void aufblasenBallon() {
        view.remove(ballon);
        x = x - 10;
        y = y - 10;
        r = r + 10;
        ballon = new Circle(x, y, r, Color.RED);
        view.wait(1000);
    }

    void platzenBallon() {
        view.remove(ballon);
        text = new Text(250, 200, "PENG!!!", Color.GREEN);
    }

    public static void main(String[] args) {
        BallonPlatzen ballonPlatzen = new BallonPlatzen();
        ballonPlatzen.main();
    }
}

Du musst/kannst view.remove(ballon); aufrufen.

Die Schriftgröße lässt sich übrigens nicht ändern:
Anhang anzeigen 14109
Dankeschön. Hat mir mega geholfen. Ich hätte eine Frage. Soweit habe ich den Code komplett verstanden und was falsch war, jedoch weiß ich nicht genau, was du am Ende mit public static void main ... gemacht hast und was für ein Sinn bzw. Folge dies hat. Würde mich aufjedenfall interessieren. Aber jetzt schonmal danke
 
N

noah_1492

Mitglied
Also dieses wild rumprobieren wird Dich nicht zum Ziel bringen (außer jemandem geht die Geduld aus und gibt die richtige Lösung ... aber dann ist der Lerneffekt gleich Null!).

Also erst einmal die Frage, was die einzelnen Dinge sind bzw. wären:

a) Circle - das ist einfach nur eine Klasse. Als Parameter taugt es also absolut nichts. Eine Klasse nur über den Namen kann man nicht übergeben. (sprich: remove(Circle) ist Quatsch!)
b) Circle.ballon - Circle ist eine Klasse haben wir bei a) gesagt. Klassenname.Variablenname wäre das Ansprechen einer Klassenvariable. Hat die Klasse Circle eine statische Variable (= Klassenvariable) ballon? Nein? ==> Also ist remove(Circle.ballon) Quatsch.
c) remove(...) -> Das ist ein Methodenaufruf. Und wenn da nur so der Name der Methode geschrieben steht, dann bedeutet dies, dass im Kontext (das wäre bei einer Instanzmethode die aktuelle Instanz und bei einer Klassenmethode die Klasse) eine Methode remove ist, die aufgerufen werden soll. Hast Du in der Klasse BallonPlatzen, die Du geschrieben hast, eine Methode remove? Nein? ==> Aufruf ist somit Quatsch.

Ich hoffe, das ist etwas, das Du erst einmal nachvollziehen konntest. Bei jedem dieser Versuche meckert der Compiler mit einer Aussage. Das ist dann meist einfach eine Umschreibung auf Englisch. Kann man sich ansehen, aber erst einmal ist wichtig, dass man den Code versteht, sprich: Was habe ich da überhaupt hingeschrieben? Und dann das Verständnis, wieso das nicht funktioniert hat....

Du hast aber in BallonPlatzen:
Code:
    View view;
    Circle ballon;
    Text text;

Was ist View? Was ist Circle? Was ist Text? Das sind ja Klassen aus der Library, die Du verwenden willst. Was machen die aber? Was bilden die ab? Hast Du das verstanden?

Also schau Dir einmal die Dokumentation von sas an: http://www.dingemann.de/sas/DokumentationSaS.5.7.pdf
Da findest Du die Beschreibung, d.h. was für Klassen es gibt (View, Circle, ...) und was man damit alles machen kann...

Und bezüglich Deines Punktes "Außerdem weiß ich nicht wie ich die Schriftgröße bei PENG ändern kann." wirst Du bestimmt auch fündig, wenn Du Dir die Beschreibung von der Klasse Text anschaust.
danke für die gute Erklärung was bei meinem Code keinen Sinn ergeben hat. Die Lösung hätte ich mir alleine jedoch nicht herleiten können
 
B

BestGoalkeeper

Bekanntes Mitglied
jedoch weiß ich nicht genau, was du am Ende mit public static void main ... gemacht hast und was für ein Sinn bzw. Folge dies hat. Würde mich aufjedenfall interessieren. Aber jetzt schonmal danke
Also... das ist in BlueJ nicht wichtig. public static void main ... ist ein allgemeiner Programmeinstiegspunkt (Womit soll es normalerweise anfangen?), allerdings übernimmt das in BlueJ BlueJ für dich, du kannst diese statische Methode also einfach entfernen.
 
B

BestGoalkeeper

Bekanntes Mitglied
Also, was ich problematisch an dieser Bibliothek finde, ist, dass die Komponenten sofort der View hinzugefügt werden, wenn man sie instantiiert , also, wenn man mit dem Konstruktor eine Instanz der Komponente anlegt.
 
K

kneitzel

Top Contributor
danke für die gute Erklärung was bei meinem Code keinen Sinn ergeben hat. Die Lösung hätte ich mir alleine jedoch nicht herleiten können
Da wäre meine Frage, woran es noch scheitert. Denn Dir eine Lösung an die Hand zu geben, die Du kopieren kannst, reicht aus meiner Sicht nicht, denn bei ähnlichen Problemen willst Du ja bestimmt eigenständig die Lösung finden können. Zumindest wäre das mein Ziel.

Einfach noch ein paar Erläuterungen:
BlueJ scheint ein eigenes Konzept für Programme zu haben, so dass dort von der typischen Java Applikation abgewichen wird. Die typische Java Applikation hat eine Klasse, in der eine Methode "public static void main (String[] args)" definiert wurde und diese Methode ist der Einstiegspunkt.
==> In BlueJ kannst Du das also erst einmal vergessen - das wird später aber auch noch kommen.

Im Word Dokument mal die erste Beschreibung zu den verwendeten Klassen angesehen?
View: Ein Objekt der Klasse View ist ein Fenster auf dem Bildschirm, das die Zeichenfläche enthält, auf der die zweidimensionalen Shapes-Objekte abgebildet werden.

Shape Objekte: Mit den in diesem Kapitel dokumentierten Klassen lassen sich zweidimensionale Grafik-Objekte - im Folgenden Shapes-Objekte genannt - erzeugen und auf der Zeichenfläche des ViewObjektes anzeigen.
(Shape ist also eine Klasse, von der andere Klassen abgeleitet wurden)

Circle: Ein Objekt der Klasse Circle ist ein Kreis auf der Zeichenfläche.

...

Das Wissen sollte dann eine Art Bild ergeben, wie die einzelnen Objekte zusammen hängen. Stell Dir das ruhig als physikalische Objekte vor. Du hast eine View und die stellt Shape Objekte da. Und dann kannst Du der View sagen: Lösche ein bestimmtes Shape Objekt...
 
N

noah_1492

Mitglied
Da wäre meine Frage, woran es noch scheitert. Denn Dir eine Lösung an die Hand zu geben, die Du kopieren kannst, reicht aus meiner Sicht nicht, denn bei ähnlichen Problemen willst Du ja bestimmt eigenständig die Lösung finden können. Zumindest wäre das mein Ziel.

Einfach noch ein paar Erläuterungen:
BlueJ scheint ein eigenes Konzept für Programme zu haben, so dass dort von der typischen Java Applikation abgewichen wird. Die typische Java Applikation hat eine Klasse, in der eine Methode "public static void main (String[] args)" definiert wurde und diese Methode ist der Einstiegspunkt.
==> In BlueJ kannst Du das also erst einmal vergessen - das wird später aber auch noch kommen.

Im Word Dokument mal die erste Beschreibung zu den verwendeten Klassen angesehen?
View: Ein Objekt der Klasse View ist ein Fenster auf dem Bildschirm, das die Zeichenfläche enthält, auf der die zweidimensionalen Shapes-Objekte abgebildet werden.

Shape Objekte: Mit den in diesem Kapitel dokumentierten Klassen lassen sich zweidimensionale Grafik-Objekte - im Folgenden Shapes-Objekte genannt - erzeugen und auf der Zeichenfläche des ViewObjektes anzeigen.
(Shape ist also eine Klasse, von der andere Klassen abgeleitet wurden)

Circle: Ein Objekt der Klasse Circle ist ein Kreis auf der Zeichenfläche.

...

Das Wissen sollte dann eine Art Bild ergeben, wie die einzelnen Objekte zusammen hängen. Stell Dir das ruhig als physikalische Objekte vor. Du hast eine View und die stellt Shape Objekte da. Und dann kannst Du der View sagen: Lösche ein bestimmtes Shape Objekt...
Ah ok. Also ich sage der Klasse view, dass sie das Objekt ballon löschen soll. Daher view.remove(Objekt in dem Fall ballon);
 
N

noah_1492

Mitglied
Wie würde das dann mit der Schriftgröße gehen. Weiß nicht was bei bold und bei int size eingesetzt werden muss
Hätte erst gedeacht: view.setFontMonospaced (boolean true, int 20);
Aber das geht nicht
 
mihe7

mihe7

Top Contributor
Wie würde das dann mit der Schriftgröße gehen. Weiß nicht was bei bold und bei int size eingesetzt werden muss
Hätte erst gedeacht: view.setFontMonospaced (boolean true, int 20);
Aber das geht nicht
Lass die Datentypen weg, die darfst Du im Methodenaufruf nicht angeben, weil diese bei der Definition der Methode bereits festgelegt wurden.
 
M

M.L.

Top Contributor
Weiterhin kann man die Beispielprogramme der genannten Seite übungs- und studienhalber unter BlueJ (oder Eclipse / NetBeans / IntelliJ /... ) zum Laufen bringen. Der Hinweis mit "static void main (String[] args)" vs. "void main()" ist übrigens korrekt.
 
B

BestGoalkeeper

Bekanntes Mitglied
Aber, wenn in der Schule/Oberstufe BlueJ eingesetzt wird, sollte man auch dabei bleiben. Zudem kommt, dass ihr inhaltlich schon relativ viel behandelt, bis zum Abi sind es doch noch ein paar Jahre... Es übt sich zwar, wer früh anfängt, aber der TE wird Klassen, Objekte, Nebeneffekte und Methodenaufrufe wohl noch nicht ganz verstanden haben...
 
Anzeige

Neue Themen


Oben