Layout-Manager, JScrollPane, ... Chaos

Ancalagon

Mitglied
Hilfe! Bin kurz vorm Durchdrehen :(
Ich hab mein Programm so weit fertig gehabt - einziges Problem: ich habe (da dies mein erstes Projekt in der Richtung war) keinen Layout-Manager verwendet (also setLayout(null)), und dabei waren Scrollbars nicht möglich. Da die GUI möglicherweise zur Laufzeit größer wird und so im worst case teilweise außerhalb des Bildschirms liegt, musste ich jetzt nachträglich noch alles umständlich in Layout-Manager pressen. Leider haben sich dadurch nur noch mehr Komplikationen ergeben und Scrollbars sind lustigerweise auch nicht vorhanden.

Da das ganze zu einem Wettbewerb gehört, würde ich den Quellcode lieber nur per PN verschicken. Wäre echt cool, wenn sich trotzdem jemand melden könnte...

Generell ist der Aufbau so:
Java:
private JScrollPane scrollPane = new JScrollPane (panel,
 ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
this.setContentPane(scrollPane);
D.h. ich wollte panel bzw dessen Inhalt die Möglichkeit geben, falls nötig Scrollbars zu bilden, und habe das entstandene scrollPane auf meine GUI gepackt. Dabei hat panel ein GridLayout mit einer Spalte und beliebig vielen Zeilen. In panel befinden sich zwei andere Panel, die also jeweils die obere bzw untere Hälfte der GUI einnehmen, panel2 und panel3.
Bei Programmstart befindet sich vorerst nur panel2 im panel (bekommt also 100% des Platzes, klappt soweit auch) und erst zur Laufzeit wird zu einem Zeitpunkt noch panel3 hinzugefügt.
Auch dies klappt noch (beide Panels haben danach natürlich 50% des GUI-Platzes).
Was nun leider zum Problem führt: panel3 besitzt ein null-Layout und (natürlich ebenfalls zur Laufzeit) ändere ich mit panel3.setBounds() die Größe von diesem (sowie der GUI, damit sie weiterhin groß genug bleibt, um panel3 anzeigen zu können).
Auch nach meinem "Layout-Manager-Umbau" passt die GUI (also das JFrame) die Größe noch wie erwünscht an, allerdings werden panel2 und panel3 von der Höhe her nicht angepasst, sie nehmen weiterhin die gleiche Menge an Platz ein und die "Vergrößerung" des JFrames bleibt weiß. Wenn das JFrame sich soweit vergrößert, dass es über den Bildschirm hinausgeht, entstehen weiterhin keine Scrollbars.

Ich hoffe, dass das jetzt nicht zu unverständlich war. Wie gesagt verschicke ich bei Bedarf gerne den kompletten Quellcode per PN (auch wenn es etwas viel ist...). Vielleicht findet sich ja jemand, der mir weiterhelfen kann... danke im Voraus :/

Das Problem an diesen Layout-Managern ist halt auch, dass das obere Panel nicht mitwachsen soll, wenn sich das untere vergrößert... absolute Positionierung hat (abgesehen von den fehlenden Scrollpanes) toll geklappt...
 

Harry Kane

Top Contributor
Dabei hat panel ein GridLayout mit einer Spalte und beliebig vielen Zeilen. In panel befinden sich zwei andere Panel, die also jeweils die obere bzw untere Hälfte der GUI einnehmen, panel2 und panel3.
[...]
Was nun leider zum Problem führt: panel3 besitzt ein null-Layout und (natürlich ebenfalls zur Laufzeit) ändere ich mit panel3.setBounds() die Größe von diesem (sowie der GUI, damit sie weiterhin groß genug bleibt, um panel3 anzeigen zu können).
Ich glaube du vermischt hier zwei Themen. Wenn panel ein GridLayout hat, dan sollten alle Kindkomponenten von panel (also panel2 und panel3) dieselbe Größe haben. Dabei ist es unerheblich, ob panel2 und panel3 wieder JPanels oder andere JComponents, und es ist auch unerheblich, welchen LayoutManager panel2 und panel3 haben. Wenn du das Layout von panel3 auf null setzt, musst du dich lediglich um die Positionierung der Komponenten innerhalb von panel3 kümmern, und nicht um die Größe und Position von panel3 selber, denn diese wird von dem LayoutManager des Containers festgelegt, in dem panel3 liegt, also vom GridLayout von panel.
Wenn das JFrame sich soweit vergrößert, dass es über den Bildschirm hinausgeht, entstehen weiterhin keine Scrollbars.
Den Sinn dieser Aussage verstehe ich nicht. Eine JScrollPane wird dann verwendet, wenn eine Komponente größer ist oder werden kann als ihr Container. Wenn der Container tatsächlich kleiner wird als die Komponente, sollten je nach ScrollbarPolicy die ScrollBars eingeblendet werden. So wie du es beschreibst, erwartest du, dass die Scrollbars erscheinen, wenn das JFrame, also der Container, zu groß wird.
Das Problem an diesen Layout-Managern ist halt auch, dass das obere Panel nicht mitwachsen soll, wenn sich das untere vergrößert... absolute Positionierung hat (abgesehen von den fehlenden Scrollpanes) toll geklappt...
Das ist halt eine Eigenschaft von GridLayout, dass alle Kindkomponenten gleich groß sind. Für das was du vorhast, wäre ev. eine Box(BoxLayout.Y_AXIS) sinnvoll.
 
Zuletzt bearbeitet:

Ancalagon

Mitglied
Hi, danke für den Post, hab da scheinbar ein paar Sachen missverstanden.

Den Sinn dieser Aussage verstehe ich nicht. Eine JScrollPane wird dann verwendet, wenn eine Komponente größer ist oder werden kann als ihr Container. Wenn der Container tatsächlich kleiner wird als die Komponente, sollten je nach ScrollbarPolicy die ScrollBars eingeblendet werden. So wie du es beschreibst, erwartest du, dass die Scrollbars erscheinen, wenn das JFrame, also der Container, zu groß wird.

Okay, das war wohl ein Verständnisfehler. Dann ist JScrollPane vielleicht gar nicht das richtige für mein Problem.
Also es ging ja um folgendes: Die GUI (das JFrame, was alles beinhaltet) wird zur Laufzeit größer und möglicherweise größer als der Bildschirm. Ich hatte quasi gehofft, dass der Bildschirm als Cotainer der GUI zählt und so bei der GUI ebenfalls Scrollbars entstehen, wenn dieser Fall eintritt...
Gibt es eine andere Möglichkeit, das zu handeln? Wie gesagt verliere ich momentan die Teile der GUI einfach, die über den Bildschirm hinausgehen, da man eben nicht hoch/runter bzw links/rechts scrollen kann.
Eine andere Möglichkeit wäre natürlich, die GUI in diesem Fall inkl. aller Komponenten so zu verkleinern, dass sie noch auf den Bildschirm passen... das wäre vielleicht nicht optimal, aber immer noch annehmbar...

Jedenfalls danke für die Hilfe und schon im Voraus für eventuelle Vorschläge :)
Das mit dem BoxLayout könnte schon mal das Problem mit den beiden ungleichen Komponenten beheben, werde ich gleich mal ausprobieren.
 

Harry Kane

Top Contributor
Die GUI (das JFrame, was alles beinhaltet) wird zur Laufzeit größer und möglicherweise größer als der Bildschirm. Ich hatte quasi gehofft, dass der Bildschirm als Cotainer der GUI zählt und so bei der GUI ebenfalls Scrollbars entstehen, wenn dieser Fall eintritt
Was würden dir ScrollBars an der GUI bringen, wenn der Bildschirm zu klein für die GUI wird? Da würden höchstens Scrollbars am Bildschirm helfen, also quasi eine Vergößerung des Desktops. Und Scrollbars am Bildschirm mit Java zu implementieren, ist ... nun ja... sagen wir mal ein sehr ambiotiniertes Unterfangen.
Nach wie vor verstehe ich den Kern deines Problems nicht: wenn die Anzahl der Komponenten in der Gui so groß wird, dass sie nicht alle auf den Bildschirm passen, gibt es eine Reihe von Möglichkeiten
a) Die Komponenten so zusammenquetschen, dass sie doch passen. Das hast du oben ja schon als "nicht optimal, aber annehmbar" beschrieben.
b) Die Komponenten so lassen wie sie sind. Dann muss sich aber die GUI (d. h. das Dingens auf dem die Komponenten liegen), vergößern. Dazu gibt es 2 grundsätzliche Möglichkeiten:
b1) Du legst deinen Hauptframe in ein Ding, welches Scrollbars hat und es erlaubt, jeweils den gewünschten Bereich des Hauptframes einzublenden. Damit wären wir wieder bei dem ambitionierten Unterfangen.
b2) Du legst in dein Hauptframe eine JScrollPane und packst darein das Ding mit den vielen Komponenten. Das sollte von der Handhabung her so ähnlich sein wie Variante b1 (scrollen muss man in beiden Fällen, weil in beiden Fällen nicht alle Komponenten auf den physikalisch vorhandenen Bildschirm passen), aber dafür mit Java Bordmitteln einfachst zu realisieren.
 

Ancalagon

Mitglied
b2) Du legst in dein Hauptframe eine JScrollPane und packst darein das Ding mit den vielen Komponenten. Das sollte von der Handhabung her so ähnlich sein wie Variante b1 (scrollen muss man in beiden Fällen, weil in beiden Fällen nicht alle Komponenten auf den physikalisch vorhandenen Bildschirm passen), aber dafür mit Java Bordmitteln einfachst zu realisieren.

Das wäre dann ja so ziemlich das, was ich mit
Java:
private JScrollPane scrollPane = new JScrollPane (panel,
   ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
   ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
this.setContentPane(scrollPane);
vorhatte. Hatte nur leider keine Wirkung :/
 

Harry Kane

Top Contributor
Wie oben ausgeführt, erscheinen JScrollbars nur, wenn die Komponente in der JScrollPane (also das panel) größer ist als die JScrollPane selber.
Die JScrollPane fragt meines Wissens dazu entweder die preferredSize der KOmponente ab, oder falls die Komponente das Scrollable interface implementiert, die preferredScrollableViewportSize. Die preferredSize eines JPanels wird durch den LayoutManager bestimmt, sofern keine preferredSize explizit gesetzt wurde, also im Falle von panel durch das GridLayout. Ich weiss nicht wie ein GridLayout die preferredSize des Containers berechnet, den es layoutet.
Ausserdem weiss ich nicht, wie ich diesen Hinweis
Hatte nur leider keine Wirkung
interpretieren soll. Gabs keine scroll bars, oder war der Inhalt von panel3 nicht zu sehen, oder beides?
Poste mal ein KSKB: ein JPanel mit einem GridLayout aus zwei Zeilen und 1 Spalte, mit zwei JTextAreas im JPanel, das JPanel in einer JScrollPane und das wiederum in einem JFrame.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
M Passender Layout-Manager AWT, Swing, JavaFX & SWT 3
R Welchen Layout Manager/ Wie strukturieren? AWT, Swing, JavaFX & SWT 14
P Swing welchen Layout Manager verwenden AWT, Swing, JavaFX & SWT 9
B Anderen Layout-Manager verwenden AWT, Swing, JavaFX & SWT 17
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
J LayoutManager Welchen Layout/Design-Manager? AWT, Swing, JavaFX & SWT 4
A Problem mit Layout-Manager AWT, Swing, JavaFX & SWT 11
B Probleme mit Layout Manager (BoxLayout) AWT, Swing, JavaFX & SWT 4
S SWT Composite mit Layout Manager geht nicht AWT, Swing, JavaFX & SWT 4
A Welcher Layout Manager ist hier richtig? AWT, Swing, JavaFX & SWT 3
Luk10 Layout-Manager AWT, Swing, JavaFX & SWT 3
P Layout Manager oder manuell?? AWT, Swing, JavaFX & SWT 7
G Layout Manager AWT, Swing, JavaFX & SWT 5
Lazybone der Richtige Layout Manager AWT, Swing, JavaFX & SWT 2
M Welcher Layout Manager? AWT, Swing, JavaFX & SWT 5
I SWT Layout Manager und weiteres. AWT, Swing, JavaFX & SWT 6
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
S Layout - Problem AWT, Swing, JavaFX & SWT 1
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
melaniemueller Layout wechseln über RadioButtons AWT, Swing, JavaFX & SWT 4
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
J Swing Hilfe bei Layout AWT, Swing, JavaFX & SWT 2
R Layered Layout AWT, Swing, JavaFX & SWT 1
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
E Swing Layout während der Laufzeit anpassen AWT, Swing, JavaFX & SWT 3
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
S Kann javafx.scene.layout.VBoxBuilder nicht importieren AWT, Swing, JavaFX & SWT 3
OSchriever Layout über Radiobuttons ändern AWT, Swing, JavaFX & SWT 4
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
I JavaFX - festes Layout AWT, Swing, JavaFX & SWT 1
S JavaFX TableView einzelne Zelle Layout zuweisen AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
Neumi5694 Swing Card-Layout, Fokus AWT, Swing, JavaFX & SWT 2
kilopack15 Interface mit Layout verknüpfen AWT, Swing, JavaFX & SWT 2
Y Layout/Ausrichtungsprobleme AWT, Swing, JavaFX & SWT 4
T JavaFX Custom Layout AWT, Swing, JavaFX & SWT 5
A GUI Layout AWT, Swing, JavaFX & SWT 11
L wie Layout-Grid in JXPanel anzeigen? AWT, Swing, JavaFX & SWT 5
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
Soloeco LayoutManager Wie und welches Layout nutze ich am Besten? AWT, Swing, JavaFX & SWT 13
M LayoutManager Modalen JDialog ein Layout zuweisen AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout reagiert nicht auf Constraints AWT, Swing, JavaFX & SWT 4
IsSchoGuat LayoutManager Layout-Containergrösse AWT, Swing, JavaFX & SWT 4
F GridBag Layout AWT, Swing, JavaFX & SWT 1
Z Absolutes Layout / Kontrolle über Anordnung AWT, Swing, JavaFX & SWT 3
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
J ComboBoxModel addElement verändert Layout AWT, Swing, JavaFX & SWT 8
E Probelm mit Layout AWT, Swing, JavaFX & SWT 1
B Hilfe welches Layout brauch ich AWT, Swing, JavaFX & SWT 4
P Tipps für GUI-Layout AWT, Swing, JavaFX & SWT 2
M LayoutManager Layout zur Laufzeit ändern AWT, Swing, JavaFX & SWT 8
N Swing Zweifarbiges Layout für den Filechooser AWT, Swing, JavaFX & SWT 12
B LayoutManager Card Layout AWT, Swing, JavaFX & SWT 2
E Angehängtes Layout, aber wie? AWT, Swing, JavaFX & SWT 12
1 Eigenes Layout schreiben AWT, Swing, JavaFX & SWT 4
B SWT layout invalidieren in SWT? AWT, Swing, JavaFX & SWT 4
J Layout: oben 20% unten 80% AWT, Swing, JavaFX & SWT 12
T Layout für Listendarstellung AWT, Swing, JavaFX & SWT 3
F LayoutManager Null-Layout unter Linux im TreeCellEditor AWT, Swing, JavaFX & SWT 3
K Eclipse Layout (Gimp Layout, Tiled Layout...) AWT, Swing, JavaFX & SWT 4
C LayoutManager Passendes Layout gesucht AWT, Swing, JavaFX & SWT 2
M Layout funktioniert nicht AWT, Swing, JavaFX & SWT 3
dzim Layout von Panes in JFX2 AWT, Swing, JavaFX & SWT 17
H Layout Idee AWT, Swing, JavaFX & SWT 8
M Swing Dynamisches Layout AWT, Swing, JavaFX & SWT 10
J LayoutManager Komponentenaustausch zerschießt Layout AWT, Swing, JavaFX & SWT 4
F Layout-Problem AWT, Swing, JavaFX & SWT 2
K Gui Layout Frage AWT, Swing, JavaFX & SWT 5
E Null-Layout - Wie geht es ohne? AWT, Swing, JavaFX & SWT 19
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
D Bild in JPanel verschiebt Layout. Wie fixieren? AWT, Swing, JavaFX & SWT 9
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
D Problem mit 3-Spalten Layout AWT, Swing, JavaFX & SWT 17
ARadauer Wenig Material zum Thema: Design, Layout, Usability von Swing Anwendungen AWT, Swing, JavaFX & SWT 11
S LayoutManager Welcher LayoutManager für dieses zweispaltige Layout? AWT, Swing, JavaFX & SWT 13
G LayoutManager Layout welches von Links nach rechts anordnet mit TOP Alignment! AWT, Swing, JavaFX & SWT 5
A Best practice für konkretes Layout AWT, Swing, JavaFX & SWT 10
G LayoutManager Layout für Spalten AWT, Swing, JavaFX & SWT 8
A Layout/JPanelgröße AWT, Swing, JavaFX & SWT 6
S pack() bei null-Layout AWT, Swing, JavaFX & SWT 10
C SWT Tabellen-Layout in StyledText? AWT, Swing, JavaFX & SWT 6
R Swing Layout setzen AWT, Swing, JavaFX & SWT 3
L Layout automatische Anpassung umgehen? AWT, Swing, JavaFX & SWT 5
J Button Layout anpassen AWT, Swing, JavaFX & SWT 22
H LayoutManager Layout mit GridBagLayout machbar? AWT, Swing, JavaFX & SWT 6
B Buttongröße im Layout AWT, Swing, JavaFX & SWT 4
B LayoutManager Layout Problem AWT, Swing, JavaFX & SWT 14
O LayoutManager Layout entwerfen AWT, Swing, JavaFX & SWT 3
A diverse Layout-Fragen AWT, Swing, JavaFX & SWT 4
F LayoutManager Eigenes Layout die Lösung?! AWT, Swing, JavaFX & SWT 4
dzim SWT Layout mit Sections aus Eclipse Forms AWT, Swing, JavaFX & SWT 17
F JScrollPane verwirft Layout von JPanel AWT, Swing, JavaFX & SWT 2
C LayoutManager Layout und vergrößern des Frames AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben