# Programmierung von BlueJ



## noah_1492 (5. Okt 2020)

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:


```
/**
* 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 (5. Okt 2020)

Mal als kleine Hilfe:

```
void aufblasen() {
        for (int i = 100; i < 150; i++) {
            ballon.scale(1.1, 1.1); // 10 % Zuwachs
            view.wait(50);
        }
    }
```


----------



## BestGoalkeeper (5. Okt 2020)

noah_1492 hat gesagt.:


> 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)


noah_1492 hat gesagt.:


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


----------



## noah_1492 (5. Okt 2020)

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:

```
/**
 * 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);
   }
}
```


----------



## BestGoalkeeper (5. Okt 2020)

Ich hab eine Frage, was ist


noah_1492 hat gesagt.:


> import sas.*;


?

Und


noah_1492 hat gesagt.:


> new Circle(x = 250, y = 145, r= 50, Color.RED);


kompiliert das?

Allgemein der Hinweis, dass du in die API Doc von 3rd Partys schauen musst.


----------



## M.L. (5. Okt 2020)

import sas.*    stammt vom Download der Bibliothek unter http://www.dingemann.de/sas/
Im zuletzt gezeigten Code könnte "remove(ballon)" zum Ziel führen  (ungetestet ohne BlueJ)


----------



## BestGoalkeeper (5. Okt 2020)

Edit: `http://www.dingemann.de/sas/` und `http://www.dingemann.de/sas/DokumentationSaS.5.7.pdf`



> "Shapes and Sprites"
> Eine Java-Grafikbibliothek für den Informatikunterricht


----------



## BestGoalkeeper (5. Okt 2020)

BestGoalkeeper hat gesagt.:


> kompiliert das?


Ach so, natürlich kompiliert das  das ist ja nur eine Zuweisung an die Variablen (innerhalb des Konstruktoraufruf).


----------



## noah_1492 (5. Okt 2020)

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)


----------



## kneitzel (5. Okt 2020)

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.


----------



## noah_1492 (5. Okt 2020)

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


----------



## noah_1492 (5. Okt 2020)

habe bisschen herumprobiert. Nun komme ich hier rauf:

```
void remove(){
   remove(Circle.ballon);
    }
```
Da zeigt das Programm an cannot find symbol - variable ballon


----------



## kneitzel (5. Okt 2020)

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:

```
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.


----------



## BestGoalkeeper (5. Okt 2020)

Hab das mal installiert...

```
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:


----------



## BestGoalkeeper (5. Okt 2020)

JustNobody hat gesagt.:


> 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.


----------



## thecain (5. Okt 2020)

BestGoalkeeper hat gesagt.:


> 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.
> 
> ...


Doku lesen ist halt doch keine schlechte Idee...


----------



## kneitzel (5. Okt 2020)

BestGoalkeeper hat gesagt.:


> 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.



BestGoalkeeper hat gesagt.:


> 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.


----------



## noah_1492 (5. Okt 2020)

BestGoalkeeper hat gesagt.:


> Hab das mal installiert...
> 
> ```
> import sas.*;
> ...


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


----------



## noah_1492 (5. Okt 2020)

JustNobody hat gesagt.:


> 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:
> 
> ...


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


----------



## BestGoalkeeper (5. Okt 2020)

noah_1492 hat gesagt.:


> 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.


----------



## BestGoalkeeper (5. Okt 2020)

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.


----------



## kneitzel (5. Okt 2020)

noah_1492 hat gesagt.:


> 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...


----------



## noah_1492 (5. Okt 2020)

JustNobody hat gesagt.:


> 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.
> ...


Ah ok. Also ich sage der Klasse view, dass sie das Objekt ballon löschen soll. Daher view.remove(Objekt in dem Fall ballon);


----------



## noah_1492 (5. Okt 2020)

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 (5. Okt 2020)

noah_1492 hat gesagt.:


> 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.


----------



## noah_1492 (5. Okt 2020)

mihe7 hat gesagt.:


> Lass die Datentypen weg, die darfst Du im Methodenaufruf nicht angeben, weil diese bei der Definition der Methode bereits festgelegt wurden.


So einfach kann es sein  Danke


----------



## BestGoalkeeper (5. Okt 2020)

thecain hat gesagt.:


> Oder eben doch
> 
> Doku lesen ist halt doch keine schlechte Idee...


Ich wusste nicht, dass man die Schriftgröße universal setzen kann... Habe auch nicht das komplette PDF gelesen ehrlicherweise.


noah_1492 hat gesagt.:


> Ah ok. Also ich sage der Klasse view, dass sie das Objekt ballon löschen soll. Daher view.remove(Objekt in dem Fall ballon);


ja


----------



## M.L. (6. Okt 2020)

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.


----------



## BestGoalkeeper (6. Okt 2020)

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...


----------

