GridBagLayout (Newbie)

Hallo!

Ich habe ein Problem mit dem GridBagLayout. Ich möchte JScrollPanels folgendermaßen verteilen:

  • die Oberfläche soll in zwei gleich breite Spalten eingeteilt sein
  • beide Spalten sind in je zwei Bereiche unterteilt
  • in der linken Hälfte hat der obere Bereich 3/4 und der untere 1/4 der Höhe
  • in der rechten Hälfte haben der obere und der untere Bereich jeweils die HÄlfte der Höhe

also ungefähr so: (falls das nicht zerschossen wird…)

_______
|…|…|
|…|__|
|__|…|
|__|__|

Ich weiß einfach nicht, in welcher Reihenfolge ich die Bereiche einfügen muss, damit es funktioniert. Habe nun schon die wildesten Ergebnisse erzielt, aber nicht das, was ich brauche. Ich weiß, das ist ziemlich kompliziert, aber vielleicht kann mir ja jemand helfen?

Vielen Dank im voraus,

Nina

… und mein Quellcode
Im Moment sieht das bei mir so aus, aber die unterschiedlichen Größen der Bereiche werden da irgendwie ignoriert:

JPanel centerPanel=new JPanel();
GridBagLayout gridbag = new GridBagLayout();
centerPanel.setLayout(gridbag);

GridBagConstraints c = new GridBagConstraints();
c.fill=GridBagConstraints.BOTH;
c.weightx=1.0;
c.weighty=1.0;

htmlPaneTopLeft = new JEditorPane(„text/html“,"");
JScrollPane scrollPaneTopLeft=new JScrollPane(htmlPaneTopLeft);

htmlPaneBottomLeft = new JEditorPane(„text/html“,„bottomleft“);
JScrollPane scrollPaneBottomLeft=new JScrollPane(htmlPaneBottomLeft);

htmlPaneTopRight = new JEditorPane(„text/html“,"");
JScrollPane scrollPaneTopRight=new JScrollPane(htmlPaneTopRight);

htmlPaneBottomRight = new JEditorPane(„text/html“,„bottomright“);
JScrollPane scrollPaneBottomRight=new JScrollPane(htmlPaneBottomRight);

c.gridx=0;
c.gridy=0;
c.gridwidth=1;
c.gridheight=3;
gridbag.setConstraints(scrollPaneTopLeft,c);
centerPanel.add(scrollPaneTopLeft);

c.gridx=1;
c.gridy=0;
c.gridwidth=1;
c.gridheight=2;
gridbag.setConstraints(scrollPaneTopRight, c);
centerPanel.add(scrollPaneTopRight);

c.gridx=0;
c.gridy=3;
c.gridwidth=1;
c.gridheight=1;
gridbag.setConstraints(scrollPaneBottomLeft, c);
centerPanel.add(scrollPaneBottomLeft);

c.gridx=1;
c.gridy=2;
c.gridwidth=1;
c.gridheight=2;

gridbag.setConstraints(scrollPaneBottomRight, c);
centerPanel.add(scrollPaneBottomRight);

Moin

  • die Oberfläche soll in zwei gleich breite Spalten eingeteilt
    sein

Also eine JSplitpane mit festgelegter Teilung in der

  • beide Spalten sind in je zwei Bereiche unterteilt

jeweils 2 JSplitpanes drin sind.

Das kann man alternativ auch mit javax.swing.SpringLayout machen. Gridbag geht theoretisch auch, wird aber bei JScrollpanes, JEditor & Co versagen.

Wenn du Code brauchts: poste nochmal.

cu

Hi!

Das kann man alternativ auch mit javax.swing.SpringLayout
machen. Gridbag geht theoretisch auch, wird aber bei
JScrollpanes, JEditor & Co versagen.

Ab welcher Version gibts denn SpringLayout? ich glaube, da bin ich mit meinem JDK nicht ganz auf dem neusten Stand… :frowning:

Wenn du Code brauchts: poste nochmal.

Das wäre cool. :smile:

Viele Grüße
Nina

Moin

Ab welcher Version gibts denn SpringLayout? ich glaube, da bin
ich mit meinem JDK nicht ganz auf dem neusten Stand… :frowning:

Bei 1.4.1 war’s schon dabei. Wann’s genau dazu gekommen ist weiss ich nicht. Steht unter javax.swing. Wird aber fast nie benutzt weil es sehr schwer in GUI-editoren umsetzbar ist. Ausserdem ist es realtiv langsam.

Für dein Problem würd ich mich aber strikt an JSplitPanes halten.

Das wäre cool. :smile:

Ohne Garantie, sprich es können Tippfehler drin sein …

Du willst den Schirm in 2 gleiche Hälten teilen:

JSplitPane screen = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
screen.setDividerLocation(0.5d); //

Hi pumpkin,

danke für den Quelltext :smile:.
Ich hab zwar noch nicht so die Ahnung vom Festlegen der Größen, aber immerhin sieht es nun erstmal halbwegs manierlich aus. (HORIZONTAL und VERTICAL war bei dir falschrum, aber das hab ich dann doch rausgekriegt *g*).

Allerdings hab ich nun noch eine Frage zu Swing (habe bisher immer mit awt gearbeitet):
ich möchte im Verlauf des Programms die Beschriftung eines JButtons ändern (also mit setText("…")). Was muss ich tun, damit die Änderung auch wirklich angezeigt wird? Die Logik dahinter funktioniert, nur die Anzeige nicht. (Das ganz wird in einem JFrame angezeigt, falls das von Bedeutung ist.)
Mit awt ging das irgendwie immer automatisch…

Viele Grüße
Nina

Moin

(HORIZONTAL und VERTICAL war bei dir falschrum, aber das
hab ich dann doch rausgekriegt *g*).

ups…

ich möchte im Verlauf des Programms die Beschriftung eines
JButtons ändern (also mit setText("…")). Was muss ich tun,
damit die Änderung auch wirklich angezeigt wird?

An sich sollte das sofort gehen aber ein JButton.repaint() müsste helfen.

(Das ganz wird
in einem JFrame angezeigt, falls das von Bedeutung ist.)

Was tut JFrame.pack() ?

cu

Nachtrag
Moin

Die Logik
dahinter funktioniert, nur die Anzeige nicht.

Moment, das könnte doch noch eine Ursache haben:

Was Threads sind und wie sie funktionieren weist du ?

Du setzt den neuen nicht zufälligerweise in einer Methode die durch ein AWT-event (wie z.b. dem Klick auf ein Button) aufgerufen wird ? Und du hälst dich auch nicht an die Synchornisation (per SwingUtilities.invokeLater()) ?

Dann ist ein Nebeneffekt aus der witzigen Welt des AWT/Swing-Render-Thread-Problems. Beschreib die Situation mal näher.

cu

Hi,

ja, ich weiß ungefähr, was Threads sind…
Die Änderung der Beschriftung soll tatsächlich durch ein Event ausgelöst werden. Nach einer bestimmten Anzahl von Clicks auf den Button ändert sich seine Funktion und deshalb eigentlich auch die Beschriftung…

Muss das zu Hause nochmal genau austesten mit dem, was du da geschrieben hast - habe das Progrämmchen gerade nicht vorliegen.

NIna

Was Threads sind und wie sie funktionieren weist du ?

Du setzt den neuen nicht zufälligerweise in einer Methode die
durch ein AWT-event (wie z.b. dem Klick auf ein Button)
aufgerufen wird ? Und du hälst dich auch nicht an die
Synchornisation (per SwingUtilities.invokeLater()) ?

Dann ist ein Nebeneffekt aus der witzigen Welt des
AWT/Swing-Render-Thread-Problems. Beschreib die Situation mal
näher.

cu

na ja…

An sich sollte das sofort gehen aber ein JButton.repaint()
müsste helfen.

Das ändert leider nichts.

Was tut JFrame.pack() ?

Es macht zwar im Moment das ganze Layout kaputt, aber dabei bleibt die Schrift auf dem button trotzdem so, wie sie es eigentlich nicht soll…

-(