# GUI (Canvas, JPanel, JButton)



## Shallty (12. Dez 2018)

Hey! ^-^)/
Ich muss gerade das Game Of Life programmieren hab die Benutzeroberfläche gerade angefangen. Eigentlich wurde sie uns bereits freigestellt, bzw. wir müssen sie nicht selbst machen, nur den Algorithmus. Ich mag es allerdings nicht, wenn ich etwas vorgefertigtes nehme, was ich dann nicht verstehe. Allerdings kenne ich mich hiermit 0 aus. xd

Ich habe jetzt ein Canvas, ein JPanel und einen JButton. Wenn ich ein JButton mache, dachte ich, dass ein JPanel dazu gehört, aber irgendwie ist das doch nicht so. Ich verstehe um ehrlich zu sein nicht, wofür man ein JPanel braucht.

Mein Problem gerade ist: Wie bringe ich meinen Button auf das Canvas drauf? Ich finde einfach nicht heraus wie ich die beiden Dinge kombiniere und bin gleichzeitig sooo verwirrt von allem...

Weitere Fragen:
- Brauch ich ein JPanel überhaupt? Ist das relevant?
- Was ist effizienter? Einfach ein Canvas mit Button drauf und einem Raster für das GoL, oder irgendetwas anderes?

Manchmal denke ich, ich hätte es lassen sollen das selbst zu machen, aber ich will das einfach nicht aufgeben. q-q
Hoffe jemand versteht wovon ich hier schreibe. xD


----------



## Robat (12. Dez 2018)

Ohne Grundlagen wirst du da schnell an deine Grenzen stoßen (wie du bereits merkst).
Ein JPanel ist erstmal nur ein Container, der andere Komponenten halten kann. Du kannst damit also bestimmte Elemente "gruppieren" und sie in einem definierten Bereich zusammenfassen.

Ich würde den JButton nicht direkt auf das Canvas packen, sondern beide Elemente auf einem JPanel vereinen. So in etwa:

```
JFrame frame = new JFrame();
frame.setSize(500, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout());

Canvas canvas = new Canvas();
canvas.setBackground(Color.RED);
contentPane.add(canvas);

JButton button = new JButton("Do something");
contentPane.add(button, BorderLayout.SOUTH);

frame.add(contentPane);
frame.setVisible(true);
```


----------



## Shallty (12. Dez 2018)

Ahhh dankeeeh
Ich hab mittlerweile auch viel mehr darüber herausgefunden, ich denke jetzt schaff ich das alles besser.
Vielen Dank nochmal. ^-^

Eine Frage hab ich aber noch: Jemand meinte zu mir etwas wie, dass JButton/JPanel zusammen in einer Library sind und Canvas aus einer ganz anderen. Ich habe deshalb anstatt Canvas einfach JPanel benutzt, hier ist aber trotzdem Canvas mit eingebracht. Gibt es irgendwelche Bedingungen bzw. Dinge die ein Canvas im Gegensatz zu einem JPanel kann und andersrum?


----------



## mihe7 (13. Dez 2018)

Shallty hat gesagt.:


> Jemand meinte zu mir etwas wie, dass JButton/JPanel zusammen in einer Library sind und Canvas aus einer ganz anderen.


Jein. Es gibt das AWT und es gibt Swing, wobei Swing auf AWT basiert.

AWT-Komponenten sind "schwergewichtig", Swing-Komponenten "leichtgewichtig". Der Unterschied besteht vor allem darin, dass AWT-Komponenten vom OS zur Verfügung gestellt werden müssen, während Swing-Komponenten in Java gezeichnet werden. AWT-Komponenten (ver)brauchen im Unterschied zu Swing-Komponenten z. B. unter Windows ein Window-Handle. Außerdem können AWT-Komponenten nur das an Funktionalität anbieten, was unter allen Betriebssystemen zur Verfügung steht. Daher fallen sie auch meist etwas spärlich aus.

Früher war es ganz schlecht, AWT- und Swing-Komponenten zu mischen. Mittlerweile wurden die Probleme aber angeblich beseitigt (habs nie ausprobiert). Trotzdem würde ich AWT- und Swing-Komponenten nicht mischen, wenn es nicht wirklich sein muss.

Wie @Robat schon geschrieben hat: JPanel ist eher als Container gedacht. Was einem Canvas am nächsten käme, wäre wohl JComponent.


----------



## Robat (13. Dez 2018)

Ich persönlich würde hier auch zu einem JComponent greifen und darauf zeichnen. Canvas ist nicht zwingend notwendig und habe das oben nur genommen, weil es erst von dir gefordert wurde


----------

