Layoutprobleme mit Box- und BorderLayout

Status
Nicht offen für weitere Antworten.

Antoras

Top Contributor
Hallo,

ich hab ein paar Probleme mit dem Box- und dem BorderLayout:
[HIGHLIGHT="Java"] private JPanel addTabPanel_Glossary() {
if (pnlGlossary == null) {
// pnlGlossary = new JPanel(new BoxLayout(this, BoxLayout.Y_AXIS));
pnlGlossary = new JPanel(new BorderLayout());
pnlGlossary.add(addSplitPane_Glossary(), BorderLayout.CENTER);
// addSplitPane_Glossary();
// addPanel_Glossary_Button();
pnlGlossary.add(addPanel_Glossary_Button(), BorderLayout.SOUTH);
}
return pnlGlossary;
}[/HIGHLIGHT]
Wenn ich meine Komponenten mit dem BoxLayout anordnen möchte (auskommentierte Zeilen), dann bekomme ich immer die Fehlermeldung BoxLayout can't be shared. Ich hab dazu schon wie verrückt rumgegoogelt, gibt offenbar auch genug Leute die das gleiche Problem haben. Aber ich hab nirgends einen Lösungsvorschlag gefunden, der was taugt.

Und wenn ich die Komponenten über das BorderLayout anordne, dann wird mein SplitPane nicht dargestellt (mit auskommentiertem Button-Panel wird es aber angezeigt).

Zusatzinformation: Beide Komponenten werden auf ein Panel gezeichnet(pnlGlossary). Das SplitPane wird dabei direkt auf dieses Panel gezeichnet, die Buttons liegen aber nochmals auf einem extra Panel(pnlGlossary_Button), das dann auf das erste Panel(pnlGlossary) gezeichnet wird.

Kann mir da jemand weiterhelfen?
 

Marco13

Top Contributor
Das, was man dem BoxLayout im Konstruktor übergibt, muss das gleiche sein, wie das, wo man das BoxLayout dann verwendet - in diesem Fall also nicht

pnlGlossary = new JPanel(new BoxLayout(this, BoxLayout.Y_AXIS));

sondern

pnlGlossary = new JPanel();
pnlGlossary.setLayout(new BoxLayout(pnlGlossary, BoxLayout.Y_AXIS)
 

Antoras

Top Contributor
Ist das nicht beides das Selbe? Ich hab gedacht, dass das this in diesem Fall auf das Panel verweist, oder liege ich da falsch?

Wie dem auch sei: Ich bekomme leider trotzdem noch die selbe Fehlermeldung. :(
 

Marco13

Top Contributor
"this" verweist auf das, wo die Methode drinsteht. Dem BoxLayout muss man aber genau DAS übergeben, worauf es angewendet werden soll, und das ist nicht "this" sondern das pnlGlossary. Poste ggf. mal ein kleines COMPILIERBARES Beispieprogramm, wo der Fehler auftritt.
 

Antoras

Top Contributor
Bitte:
[HIGHLIGHT="Java"]
import java.awt.Dimension;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;



public class BoxLayoutCantBeShared extends JFrame{

private JPanel pnlBase = null;
private JPanel pnlButton = null;
private JButton bt = null;

public static void main(String args[]) {
new BoxLayoutCantBeShared();
}

public BoxLayoutCantBeShared() {
setPreferredSize(new Dimension(1000, 700));
setLocation(100, 100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addPanel_Base();
pack();
setVisible(true);
}

private JPanel addPanel_Base() {
if (pnlBase == null) {
pnlBase = new JPanel(new BoxLayout(pnlBase, BoxLayout.Y_AXIS));
addPanel_Button();
add(pnlBase);
}
return pnlBase;
}

private JPanel addPanel_Button() {
if (pnlButton == null) {
pnlButton = new JPanel();
addButton();
pnlBase.add(pnlButton);
}
return pnlButton;
}

private JButton addButton() {
bt = new JButton("Button");
pnlButton.add(bt);
return bt;
}

}
[/HIGHLIGHT]
 

Marco13

Top Contributor
Bei diesem Aufruf
pnlBase = new JPanel(new BoxLayout(pnlBase, BoxLayout.Y_AXIS));
ist pnlBase während des Aufrufs noch 'null'. Es muß ja erst noch erzeugt werden (da ist man in dieser Zeile ja gerade dabei...)

Wie ich schon geschrieben hatte:
pnlBase = new JPanel();
pnlBase.setLayout(new BoxLayout(pnlBase, BoxLayout.Y_AXIS));
 

Antoras

Top Contributor
Ach verdammt, was für ein scheiß Fehler. Ist aber auch total bescheuert. Das hätten die Java-Entwickler ja auch so regeln können, dass bei diesem zusammengesetztem Befehl zuerst das Panel erstellt wird und dann das Layout gesetzt wird.

Na egal. Problem gelöst! Danke dir.

Aber eines versteh ich nicht: Warum kann ich andere Layouts wie beispielsweise das BorderLayout direkt übergeben, das BoxLayout aber nicht?

EDIT: Wahrscheinlich bekommt man eine Exception, weil beim BoxLayout ja direkt ein Wert übergeben wird (eben das Panel auf das man zeichnet). Aber wenn das der Grund ist, warum hat man dieses Layout dann so komisch gelöst? Braucht man bei den anderen Layouts ja auch nicht.
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
Ach verdammt, was für ein scheiß Fehler. Ist aber auch total bescheuert. Das hätten die Java-Entwickler ja auch so regeln können, dass bei diesem zusammengesetztem Befehl zuerst das Panel erstellt wird und dann das Layout gesetzt wird.
wie jetzt, einfach die ausführungsreihenfolge abändern oder wie? :eek:
Und was ist, wenn man da sowas wie
A a=new A(new B(a));
hat und sowohl B als auch A wirklich beide direkt im konstruktor auf die eigenschaften des jeweils anderen zugreifen müssen? Unendlichschleife? Ne, lieber nicht..

Aber eines versteh ich nicht: Warum kann ich andere Layouts wie beispielsweise das BorderLayout direkt übergeben, das BoxLayout aber nicht?

EDIT: Wahrscheinlich bekommt man eine Exception, weil beim BoxLayout ja direkt ein Wert übergeben wird (eben das Panel auf das man zeichnet). Aber wenn das der Grund ist, warum hat man dieses Layout dann so komisch gelöst? Braucht man bei den anderen Layouts ja auch nicht.
Verdammt gute frage. Habe jetzt nach 15 minuten rumgoogln keine auch nur halbwegs plausible antwort entdecken können...
http://java.sun.com/javase/6/docs/api/javax/swing/BoxLayout.html#layoutContainer(java.awt.Container)

Da steht:
AWTError - if the target isn't the container specified to the BoxLayout constructor
und sonst ist NICHTS zu finden. Anscheinend muss man sich mit dem umständlichen Konstruktor nur ärgern, damit man sich später mit den AWTErrors ärgern darf, cleverer ging's ja wohl nicht!
32.gif


Imho ist sowas völlig sinnfrei, da bei jedem LayoutManager bei jedem aufruf immer wieder der container mit übergeben wird:
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/LayoutManager.html#layoutContainer(java.awt.Container)
hat Signatur:
layoutContainer(Container target)
wozu man da irgendwelche "extra"-informationen aus dem Konstruktor braucht? kA...???:L
 
Zuletzt bearbeitet:

Antoras

Top Contributor
wie jetzt, einfach die ausführungsreihenfolge abändern oder wie? :eek:
Und was ist, wenn man da sowas wie
A a=new A(new B(a));
hat und sowohl B als auch A wirklich beide direkt im konstruktor auf die eigenschaften des jeweils anderen zugreifen müssen? Unendlichschleife? Ne, lieber nicht..
Ok, hab nicht zu Ende gedacht. Wäre tatsächlich ein Problem.
wozu man da irgendwelche "extra"-informationen aus dem Konstruktor braucht? kA...???:L
Vielleicht hat ein findiger Java-Programmierer irgendwann mal nicht weit genug gedacht und das so umständlich gelöst. Und später gab es niemand, der das ändern wollte. Die letzte Änderung ist auch schon ne ganz schöne Zeit her:
Code:
@version 1.37 04/10/06		//aus Javadoc
 

Antoras

Top Contributor
Also, ich hab jetzt auch das Problem mit dem BorderLayout gelöst. Allerdings kann ich nicht sagen weshalb der Fehler auftritt. Hoffe, dass mir das jemand erklären kann.

CENTER wird nicht angezeigt, SOUTH aber schon:
[HIGHLIGHT="Java"]private JPanel addTabPanel_Glossary() {
if (pnlGlossary == null) {
pnlGlossary = new JPanel(new BorderLayout());
pnlGlossary.add(addSplitPane_Glossary(), BorderLayout.CENTER);
pnlGlossary.add(addPanel_Glossary_Button(), BorderLayout.SOUTH);
}
return pnlGlossary;
}[/HIGHLIGHT]

CENTER und SOUTH werden angezeigt:
[HIGHLIGHT="Java"]private JPanel addTabPanel_Glossary() {
if (pnlGlossary == null) {
pnlGlossary = new JPanel(new BorderLayout());
pnlGlossary.add(addPanel_Glossary_Button(), BorderLayout.SOUTH);
pnlGlossary.add(addSplitPane_Glossary(), BorderLayout.CENTER);
}
return pnlGlossary;
}[/HIGHLIGHT]
Und das mit dem BoxLayout bedarf auch noch einer Eklärung... ;)
 

Ebenius

Top Contributor
Wie sieht denn Deine addPanel_Glossary_Button()-Methode aus? (Wieso heißt die eigentlich addXXX(), wenn doch außerhalb hinzugefügt wird? Sollte das nicht createXXX() heißen?)

Ebenius
 

Antoras

Top Contributor
Jetzt werden plötzlich beide Panels angezeigt, egal in welcher Reihenfolge ich sie aufrufe. Komisch. Hab eigentlich nichts geändert. ???:L

(Wieso heißt die eigentlich addXXX(), wenn doch außerhalb hinzugefügt wird? Sollte das nicht createXXX() heißen?)
Hm, gute Frage. create wäre hier echt besser. Werde ich mal ändern.
 

Antoras

Top Contributor
Ist aber so (kann es selber nicht glauben???:L), in den Methoden steht eigentlich auch nur der Aufruf der Komponenten auf dem Panel:
[HIGHLIGHT="Java"]private JPanel createPanel_Glossary_Button() {
if (pnlGlossary_Button == null) {
pnlGlossary_Button = new JPanel(new FlowLayout());
createLabel_Glossary_Information();
createButton_Glossary_New();
createButton_Glossary_Change();
createButton_Glossary_Delete();
add(pnlGlossary_Button);
}
return pnlGlossary_Button;
}[/HIGHLIGHT]
Und das SplitPane macht eigentlich auch nicht mehr:
[HIGHLIGHT="Java"]private JSplitPane createSplitPane_Glossary() {
if (spGlossary == null) {
spGlossary = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
createScrollPane_Glossary(), createTextPane_Glossary());
spGlossary.setPreferredSize(new Dimension(900, 200));
add(spGlossary);
}
return spGlossary;
}[/HIGHLIGHT]
Wie gesagt, ich hab keine Ahnung wo der Fehler lag.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Layoutprobleme mit Scrollpane Java Basics - Anfänger-Themen 3
G Optisch JPanel BorderLayout vertikaler Rand dicker als horizontaler Rand Java Basics - Anfänger-Themen 4
M BorderLayout, 2Panels, EAST wird nicht angezeigt ?? Java Basics - Anfänger-Themen 2
I In der Mitte eines Frames mit BorderLayout etwas malen Java Basics - Anfänger-Themen 7
F Content Pane / BorderLayout Java Basics - Anfänger-Themen 2
B Drawline mit Borderlayout Java Basics - Anfänger-Themen 3
G Konstruktor, BorderLayout nimmt Component nicht auf Java Basics - Anfänger-Themen 2
A Taschenrechner-GUI mit BorderLayout? Java Basics - Anfänger-Themen 6
M BorderLayout zickt! Ein Panel versteckt das andere! Java Basics - Anfänger-Themen 6
M JPanel, JButtons, Borderlayout Java Basics - Anfänger-Themen 8
P BorderLayout Java Basics - Anfänger-Themen 11
O AWT, Dubiose Ausgabe BorderLayout Java Basics - Anfänger-Themen 2
Spin Borderlayout Java Basics - Anfänger-Themen 4
A Problem mit BorderLayout und null-Layout Java Basics - Anfänger-Themen 5
G Frage zum BorderLayout Java Basics - Anfänger-Themen 2
kulturfenster BorderLayout Java Basics - Anfänger-Themen 3
G aktueller Panel, der in BorderLayout.SOUTH angeordnet ist Java Basics - Anfänger-Themen 11
S Button und BorderLayout Java Basics - Anfänger-Themen 2
P BorderLayout und Center fkt. nicht Java Basics - Anfänger-Themen 4
R BorderLayout macht meine Zeichnung kaputt Java Basics - Anfänger-Themen 14
F Kurze Frage: JLabel in BorderLayout einfügen Java Basics - Anfänger-Themen 2
S BorderLayout Ausrichtung Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben