Java GridLayout: Richtig designen und Area für Buttons?

FrazeColder

Lt. Commander
Registriert
Okt. 2013
Beiträge
1.721
Moin Community,

Ich bin immer noch am erstellen, designen und kodieren meiner GUI :)
Für das ganze verwende ich IntelliJ und das GridLayout - Allerdings habe ich da ein paar Fragen.

Ich würde gerne ein echt geile GUI auf die Beine stellen und wollte euch mal fragen, wie ich den in einem GridLayout Componenten richtig anordnen kann?
Es gibt zwar diese Spacer, allerdings werden diese ja zu "Luft", sodass die Componenten immer direkt an dem Rand des Frames sind. Wie kann ich das den ändern, das wäre die erste Frage?

Die zweite Frage ist etwas spezieller. Ich muss Buttons erzeugen lassen. Damit meine ich, angenommen der User hat 4 Freunde, muss ich 4 Buttons erzeugen lassen, wären es 9, bräuchte ich 9 Button.
Diese Buttons dann zu beschriften ist ja nicht schwierig. Nur wie mache ich das?
Am besten noch in einer ScrollPane, damit nicht der halbe Bildschirm dann voll ist...

MfG und Danke!
 
AWT, Swing, JavaFX, GWT, ...? Was benutzt du?
 
Grundsätzlich würde ich dir vom GridLayout abraten, es sei denn, du willst etwas wie einen Taschenrechner programmieren. Schau dir doch mal das GridBagLayout an. Das ist deutlich angenehmer, wenn es darum geht, Zellen mit unterschiedlichen Größen darzustellen.

FrazeColder schrieb:
Diese Buttons dann zu beschriften ist ja nicht schwierig. Nur wie mache ich das?
Da du dir hier gerade auf's Derbste selbst widersprichst nehme ich an, entweder du oder ich haben net verstanden, was genau du willst. Bitte nochmal anschaulicher darlegen ;-)
 
Ich benutzte Swing.

Das Problem ist nur, ich bin mittlerweile schon sehr weit und möchte auf jeden Fall auch resizeable Frame haben!

EDIT:
Habe gerade mal gegooglet. Hier sind die Vorteile von dem GridBadLayout:
https://www.dpunkt.de/java/Programmieren_mit_Java/Oberflaechenprogrammierung/82.html

Ist es möglich, ohne den ganzen Code neu zu schreiben und alles neu zu designen, dass Layout von GridLayout auf GridBagLayout in IntelliJ zu wechseln?
 
Zuletzt bearbeitet:
Wtf?

FrazeColder schrieb:
Ist es möglich, ohne den ganzen Code neu zu schreiben und alles neu zu designen, dass Layout von GridLayout auf GridBagLayout in IntelliJ zu wechseln?
Ähm. Du bist doch Programmierer. Schreib Dir doch ein kurzes Programm, welches Deinen Code anpasst?!
 
FrazeColder schrieb:
Ich muss Buttons erzeugen lassen. Damit meine ich, angenommen der User hat 4 Freunde, muss ich 4 Buttons erzeugen lassen, wären es 9, bräuchte ich 9 Button.
Diese Buttons dann zu beschriften ist ja nicht schwierig. Nur wie mache ich das?
Am besten noch in einer ScrollPane, damit nicht der halbe Bildschirm dann voll ist...

Dutzende Buttons, die zudem nicht auf eine Seite passen, würde ich auf Anhieb nicht mit einer "geilen GUI" assoziieren. Vermutlich gibt es bessere Wege, Deine Anforderungen umzusetzen und wenn Du den Code ohnehin umschreiben musst...
 
Merke ich auch. Ist dann nicht nötig...

Habe jetzt ein GridBagLayout. Aber immer noch 2 fragen...

Wie kann ich mir auf BEDARF hin 5 Buttons erzeugen lassen, die dann auch nicht irgendwo, sondern an einer bestimmten Stelle sind?
Das heißt, es können mal 2 oder 4 Buttons sein und die Anzahl verändert sich während der Laufzeit!

Wobei, da fällt mir gerade ein, es wäre evtl doch besser, die Buttons in einer ScrollPane zu erzeugen, da das Fenster ja sonst nicht passt. Weil eben ein paar Buttons hinzu kommen... Und ein Fenster was sich selbst resized ist irgendwie nicht cool...

Die zweite Frage ist, wie kann ich eine flüssige ProgressBar machen?
Ich habe es schon hinbekommen, dass die in 20 s abläuft, allerdings mache ich das mit einem Thread, den ich dementsprechend schlafen lege... Nur stockt das dann...

Die dritte und letzte Frage ist, kann man das komplette "color scheme" ändern?
Ich würde gerne andere Farben für die Gui nutzten, als Java macht.
Aber dann muss ich von allen Komponenten die Farbe einzeln wechseln...
Kann man ggf. einfach das "dunkle Design", aus dem GUI Designer von IntelliJ, verwenden?

Vielen Dank für die Hilfe!
 
Die Anforderungen ändern sich ja recht schnell...


FrazeColder schrieb:
Wie kann ich mir auf BEDARF hin 5 Buttons erzeugen lassen, die dann auch nicht irgendwo, sondern an einer bestimmten Stelle sind? Das heißt, es können mal 2 oder 4 Buttons sein und die Anzahl verändert sich während der Laufzeit!

Ich persönlich würde nicht GridBagLayout verwenden... Damit wird es wohl am einfachsten sein, wenn Du die Buttons nicht direkt hinzufügst, sondern ein eigenes Panel nimmst, das an die gewünschte Stelle setzt und diesem die gewünschten Buttons hinzufügst.


FrazeColder schrieb:
Wobei, da fällt mir gerade ein, es wäre evtl doch besser, die Buttons in einer ScrollPane zu erzeugen, da das Fenster ja sonst nicht passt. Weil eben ein paar Buttons hinzu kommen...

Der Layout-Manager sorgt (korrekt eingestellt) dafür, dass die Elemente den vorhandenen Platz nutzen. Nur weil einige Buttons hinzukommen, muss das nicht zwingend bedeuteten, dass man ein ScrollPanel benötigt.


FrazeColder schrieb:
Die zweite Frage ist, wie kann ich eine flüssige ProgressBar machen?
Ich habe es schon hinbekommen, dass die in 20 s abläuft, allerdings mache ich das mit einem Thread, den ich dementsprechend schlafen lege... Nur stockt das dann...

Code? Wie oft wird aktualisiert? Die EDT-Regel kennst Du?


FrazeColder schrieb:
Die dritte und letzte Frage ist, kann man das komplette "color scheme" ändern?

Entweder ein anderes Look & Feel nutzen oder einzelne Elemente den Wünschen anpassen.

https://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/

FrazeColder schrieb:
IKann man ggf. einfach das "dunkle Design", aus dem GUI Designer von IntelliJ, verwenden

Kann man: https://github.com/bulenkov/Darcula (Wurde allerdings nicht schon länger nicht mehr aktualisiert, die IntelliJ-Version ist aktueller).


JavaFX lässt sich übrigens recht einfach modden. Ich würde heute nicht mehr allzu viel Ressourcen in Swing investieren.
 
Alles Klar, ich werde es mal versuchen!

Was ist die "EDT-Regel"?

Ich werde es mir mal anschauen! - Danke! :)
 
Alles Klar :)

Da fehlt mir noch eine Frage ein... :/ - Habe schon gegoogelt, aber nichts gefunden...
Wie kann ich den auf einem Button in Java nur ein Teil des Textes FETT schreiben und kann man auch einen Button in Zeilen beschreiben?
Denn dann könnte man sagen, mach nur die erste Zeile Fett... Nur wie?
Ergänzung ()

Danke, habe es. Einfach einen Button machen, Layout zuweisen, Labels reinmachen, fertig :D
Ergänzung ()

Allerdings bleibt mir irgendwie doch noch eine Frage.

Ich habe meine Buttons jetzt erzeugt, kann diese aber nicht meinem Panel hinzufügen... mache das mit:
Code:
panel.add(button);

Wenn ich den Button aber in eine ScroolPane einfüge, funktioniert das problemlos... ?!
Code:
scrollPane.getViewport().add(test1, null);

Sollte jemand eine Idee haben, wie ich das in einem Panel mache, allerdings dann die auch so anordnen kann, dass Sie in einer Reihe und gleichgroß sind, würde ich mich freuen!

Also angenommen, es sind nur 3 Buttons, dann sollen die 3 Buttons alle gleichgroß sein und die Breite und Höhe des Panels ausfüllen. Natürlich mit einem kleinen Abstand dazwischen.
Sollten es aber z.B. 5 Buttons sein, so sollten diese 5 nur so groß sein, dass diese immer noch in einer Reihe auf das Panel passen...
 
Einfacher geht es, indem man für den Button-Text HTML verwendet.

Code:
button.setText("<html><b>First</b><br>Second</html>")
 
Okay, danke. Dann werde ich es mal so umsetzten. Bleibt aber noch die Frage mit dem JPanel ...
 
Was hat denn das Panel für einen LayoutManager? revalidate() aufgerufen?
 
Was ist für Dich "normal"? Dem Beispiel oben entnommen, scheinst Du keine Constraints zu verwenden. Das wäre schon mal sehr ungewöhnlich. Wobei GridBag hier (für mich ohnehin) nicht die naheliegende Wahl wäre.

Ich würde mich an Deiner Stelle zuerst etwas näher mit Layout-Managern beschäftigen, bevor ich mit der Umsetzung der GUI weitermachen würde. Ein kleines Programm, das nur verschiedene Buttons anzeigt, ist schnell geschrieben und damit könnte man losgelöst experimentieren (den Code kann man später ja für die GUI weiterverwenden).
 
Zurück
Oben