Toon posts:

[JAVA] Layout (border, grid, flow) probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Wat ik wil bereiken in een frame is een JPanel links met varriable brete, een JPanel in het midde met vaste brete en een JPanel rechts met varriable brete. Het probleem zit hem in de keuze van de layout manager. Allereerst heb ik BorderLayout gebruikt. Deze doet het aardig maar laat geeft de middelste een varriable breete en de linker en rechter niet. Daarna heb ik de gridlayout geprobeert maar daar kan de breete van de middelste niet zetten.

Nu heb ik de Api al goed bestudeerd en ik weet dat er nog wat andere layout mananagers zijn. Echter zijn die wat ingewikelder. Echter ga ik naar GridBaglayout en Boxlayout kijken.
Graag hoor ik hier of ik misschien beter een andere layout manager kan kiezen of dat iemand een goede tutorial heeft. Want met grid, flow of border layout kwam ik er niet uit.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 21:44

Robtimus

me Robtimus no like you

Roep voor dat middelste panel eens setMaximumSize, setMinimumSize en setPreferredSize aan met gelijke waarden. Als ie dan nog van grootte kan veranderen is het knap.

Bij GridBagLayout moet je je eerste panel toevoegen terwijl de waarde van je GridBagConstraints.weightx op 0.5 staat, de middelste met 0.0 en de rechter weer met 0.5. Dan zal de middelste ook niet resizen, de andere 2 evenveel.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Hoewel ik vermoed dat je er met een BorderLayout ook uit zou moeten komen, zou ik kiezen voor een GridBagLayout. Je moet deze wel even goed bestuderen en mee rommelen voordat je precies in de gaten hebt hoe het werkt.

Om het even duidelijk te maken hier een voorbeeldje wat ongeveer doet wat de bedoeling is. Lees de comments goed en pak de documentatie erbij om het te begrijpen. Pruts een beetje met de waarden die bij de GridBagConstraints worden opgegeven om te zien wat ze veranderen aan het gedrag van de componenten.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import javax.swing.*;
import java.awt.*;

public class GridBagExample extends JFrame {

   public static void main ( String args[] ) {
      GridBagExample app = new GridBagExample();
      app.createGrid ();
   }


   private JPanel _left,
                  _right,
                  _center;


   public GridBagExample () {
      super ( "GridBag example" );
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }

   public void createGrid () {
      JPanel contentPanel = new JPanel ( new GridBagLayout () );

      _left = new JPanel ();
      _center = new JPanel ();
      _right = new JPanel ();

      GridBagConstraints gbc = new GridBagConstraints ();

      // Ik schrijf het expres even uit voor de property names. Als
      // je daar eenmaal mee bekend bent kun je ook de constructor van
      // GridBagConstraints gebruiken

      // De ruimte die overblijft door bijv. te resizen moet in zowel
      // horizontale als verticale richting verdeeld worden.
      // Zie ook GridBagConstraints.HORIZONTAL en
      // GridBagConstraints.VERTICAL
      gbc.fill = GridBagConstraints.BOTH;

      // Gridbags werken met cellen. Je moet voor elk component dat je
      // toevoegt aangeven in welke cel het terecht moet komen.
      // De eerste cel is normaal gesproken linksbovenin de container
      gbc.gridx      = 0;
      gbc.gridy      = 0;

      // Als je HTML kent is gridwidth en gridheight het best te vergelijken
      // met resp. col- en rowspan attributen van bijv. een 'td' element.
      // Het geeft aan in hoeverre er meerdere 'cellen' gebruikt moeten worden
      // voor het toe te voegen component
      gbc.gridwidth  = 1;

      // De weight* properties worden gebruikt om te bepalen in welke
      // mate de overschietende ruimte (door bijv. resizen) verdeeld moet
      // worden over componenten. 1 betekent 'Dit element weegt zwaar', 0
      // betekent 'Dit element krijgt geen extra ruimte
      gbc.weightx    = 1f;
      gbc.weighty    = 1f;
      contentPanel.add ( _left, gbc );

      // We schuiven nu 2 cellen naar rechts, we willen tenslotte
      // dat de derde cel (de _right panel) nagenoeg de zelfde eigenschappen
      // krijgt als de eerste cel.
      gbc.gridx      = 2;
      contentPanel.add ( _right, gbc );

      // Terug naar de middelste cel.
      gbc.gridx      = 1;
      // Deze mag geen extra ruimte toegekend
      // krijgen als de ruimte opnieuw verdeeld wordt. De weightx moet dus
      // 0 zijn.
      gbc.weightx    = 0f;
      contentPanel.add ( _center, gbc );

      // We geven de middelste cel even een standaard breedte en hoogte
      _center.setPreferredSize ( new Dimension ( 300, 200 ) );

      // en geven de linker en rechterpanel even een randje voor de duidelijkheid.
      _left.setBorder ( BorderFactory.createLineBorder ( Color.BLACK ) );
      _right.setBorder ( BorderFactory.createLineBorder ( Color.BLACK ) );

      setContentPane ( contentPanel );
      pack ();
      setVisible ( true );
   }
}


offtopic:
Het is trouwens, breedte, niet brete ;)


edit:
Hm, applicaties afsluiten is ook wel handig O-) EXIT_ON_CLOSE added

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op het moment dat ik niet met een simpele layout kan werken zoals Flow of Border grijp ik meteen naar Forms Layout van JGoodies. Je hoeft dan nog maar 1 LayoutManager te kennen en je bent klaar.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 21:44

Robtimus

me Robtimus no like you

IceManX schreef op 09 maart 2004 @ 18:51:
Roep voor dat middelste panel eens setMaximumSize, setMinimumSize en setPreferredSize aan met gelijke waarden. Als ie dan nog van grootte kan veranderen is het knap.
Bij deze is de BorderLayout stom, want hij houdt zich niet aan de maximum size van een panel.

De code die drm je gaf moet werken; wil je dat de panels volgens een andere verhouding worden geresized dan 1:1, dan verander je de weightx voor allebei de panels in bv 0.3 en 0.7.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
Leuke link alarmnummer maar drm is gewoon weg de held van de dag. Heel duidelijk uitgelegt. Echt bedankt!

[ Voor 2% gewijzigd door Verwijderd op 10-03-2004 17:16 . Reden: Spelfouten :( ]

Pagina: 1