Toon posts:

[JAVA] GridBagLayout vraagstuk

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Na enkele uren allerlei documentatie doorgelezen te hebben over de verschillende soorten LayoutManagers die er bestaan in JAVA is de GridBagLayout denk ik de beste keuze als je je layout zo flexibel mogelijk wilt hebben. Aangezien het ontzettend veel overeenkomsten vertoond met een HTML-tabel is het relatief eenvoudig te doorgronden.

Voor zover ik het kan zien stel je eerst al je eigenschappen in op je constraints om hem vervolgens toe te voegen aan je panel.

gridx bepaalt de positie op de x-as
gridy bepaalt de positie op de y-as

weight stelt de minimumgrootte vast???

en met fill en anchor schijn je de manier van schaling (boven, beneden e.d.) te kunnen bepalen.

Helaas gaat het niet helemaal goed, want als ik een testje probeer dat ik een JLabel met tekst gevolgd door een textfield zonder inhoud, dan laat hij de tekstfield als 1 pixel groot zien. Geef ik hem inhoud dan vergoot hij wel...

AARGH....

Ik gebruik de volgende methode:

// voegt een component toe aan de GridBagLayout
protected void addGridBagComponent(JPanel paneel, Component c, GridBagConstraints constraints, int xpos, int ypos, int breedte, int hoogte)
{
// positie op de x-as
constraints.gridx = xpos;
// positie op de y-as
constraints.gridy = ypos;
// breedte van de cel
constraints.gridwidth = breedte;
// hoogte van de cel
constraints.gridheight = hoogte;
// toevoegen
paneel.add(c, constraints);
}

Deze methode roep ik aan in onderstaande code:
GridBagConstraints constraints = new GridBagConstraints();
jlKlantnummer.setText("Dit is een hele erge lange test-tekst ten behoeve van de gridbaglayout.");
// tfOrder.setText("fdjskdfjkdfjkfdjkfdjkdfkj");
constraints.weightx = 100;
constraints.weighty = 100;
layout.addGridBagComponent(this.klantenPaneel, jlKlantnummer, constraints, 0, 0, 1, 1);
constraints.weightx = 100;
constraints.weighty = 100;
constraints.anchor = GridBagConstraints.EAST;
layout.addGridBagComponent(this.klantenPaneel, tfOrder, constraints, 1, 0, 1, 20);

Wie kan mij vertellen hoe ik een minimale breedte instel op een cel?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
Verwijderd schreef op 29 May 2003 @ 20:28:
weight stelt de minimumgrootte vast???
Nee, weight is het relatieve gewicht van een kolom (of rij). Als je dus twee kolommen hebt, de eerste met een gewicht van 3 en de tweede met een gewicht van 1, dan zullen die kolommen bij voorkeur in de verhouding 3:1 weergegeven worden. De eerste kolom beslaat dus bijvoorbeeld drie kwart van het scherm en de tweede het resterende kwart.

Je kunt weight dus niet zomaar gebruiken om een minimale grootte op te geven; als je bij een layout met twee kolommen beide kolommen immers een gewicht van 100 geeft, dan had je net zo goed niets kunnen doen, want 100:100 is gelijk aan 1:1 (en 1 is de default waarde, als ik me niet vergis).
Wie kan mij vertellen hoe ik een minimale breedte instel op een cel?
Dat kan niet met een GridBagLayout. Wel kun je een component met een bepaalde minimumbreedte in de cel stoppen dan zal de layout manager ook proberen de cel minimaal zo breed te maken (als dat kan).

Verwijderd

Ik heb een aparte class die ik gebruik voor een GridBagLayout:
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import java.awt.*;
import javax.swing.*;

/**
 *A JPanel with a sophisticated GridbagLayout
 */
public class GridBagLayoutPanel extends JPanel
{
   /**
    *Declaration of the GridBagConstraints
    */   
    private GridBagConstraints constraints;
    
   /**
    *Declaration of constraints values
    */
    private final static int GRIDWIDTH = 1;
    private final static int GRIDHEIGHT = 1;    
    
    private final static int FILL_NONE = GridBagConstraints.NONE;
    private final static int FILL_BOTH = GridBagConstraints.BOTH;
    private final static int FILL_HORIZONTAL = GridBagConstraints.HORIZONTAL;
    private final static int FILL_VERTICAL = GridBagConstraints.VERTICAL;    
    
    private final static int ANCHOR_WEST = GridBagConstraints.WEST;
    private final static int ANCHOR_CENTER = GridBagConstraints.CENTER; 
    
    private final static double WEIGHTX = 0;
    private final static double WEIGHTY = 0;
    
   /**
    *Default constructor
    *Create a GridBagLayout panel using a default insets constraint
    */
    public GridBagLayoutPanel() 
    {
        this(new Insets(2, 2, 2, 2));
    }
    
   /**
    *Constructor with insets constraints
    *Create a GridBagLayout using user-specified insets
    */
    public GridBagLayoutPanel(Insets insets)
    {
        super(new GridBagLayout());
        constraints = new GridBagConstraints();
        constraints.insets = insets;
    }
    
   /**
    *Method to add a component to specified row and column
    *Gridwidth and gridheight are set to default value (0)
    *Weigthx and weighty are set to default value (0);
    *Fill is set to NONE and anchor is set to WEST
    */
    public void addComp(JComponent component, int row, int column)
    {
        addComponent(component, row, column, GRIDWIDTH, GRIDHEIGHT, FILL_NONE, 
            WEIGHTX, WEIGHTY, ANCHOR_WEST);
    }
    
   /**
    *Method to add a component to a specified row and column,
    *spanning across a specified number of rows and columns
    */
    public void addComp(JComponent component, int row, int column, int width, int height)
    {
        addComponent(component, row, column, width, height, FILL_NONE, WEIGHTX, WEIGHTY, ANCHOR_WEST);
    }
    
   /**
    *Method to add a component width specified rows, columns and anchors constraints
    */
    public void addAnchoredComp(JComponent component, int row, int column, int anchor)
    {
        addComponent(component, row, column, GRIDWIDTH, GRIDHEIGHT, FILL_NONE, 
            WEIGHTX, WEIGHTY, anchor);
    }
    
   /**
    *Method to add a component width specified rows, columns, spanning across
    *a specified number of rows and columns, using a specified anchor constraint
    */
    public void addAnchoredComp(JComponent component, int row, int column, 
        int width, int height, int anchor)
    {
        addComponent(component, row, column, width, height, FILL_NONE, WEIGHTX, WEIGHTY, anchor);
    }
    
   /**
    *Method to add a component with specified row and column, with
    *specified fill constraint
    */
    public void addFilledComp(JComponent component, int row, int column, int fill)
    {
        addComponent(component, row, column, GRIDWIDTH, GRIDHEIGHT, fill, WEIGHTX, WEIGHTY, ANCHOR_WEST);
    } 
    
   /**
    *Method to add a component with specified row and column, with
    *specified gridwidth, gridheight and fill constraints
    */
    public void addFilledComp(JComponent component, int row, int column, int width, 
        int height, int fill)
    {
        addComponent(component, row, column, width, height, fill, WEIGHTX, WEIGHTY, ANCHOR_WEST);
    }    
    
   /**
    *Main-method to add a component to the specified row and column,
    *spanning specified number of rows and columns, with
    *specified fill and anchor and weight constraints
    */
    public void addComponent(JComponent component, int row, int column, int width, 
        int height, int fill, double weightx, double weighty, int anchor)
    {
        constraints.gridx = column;
        constraints.gridy = row;
        constraints.gridwidth = width;
        constraints.gridheight = height;
        constraints.fill = fill;
        constraints.weightx = weightx;
        constraints.weighty = weighty;
        constraints.anchor = anchor;        
        
        add(component, constraints);
    }
}

En als ik dus een GridBagLayout wil gebruiken in een class dan werkt het ongeveer zo:
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
import java.awt.*;
import java.applet.*;
import javax.swing.*;

public class Test extends JApplet
{
    private JButton jb1;
    private JButton jb2;
    private JButton jb3;
    private JButton jb4;
    private JButton jb5;    
    private GridBagLayoutPanel panel;
    
    public void init()
    {
        panel = new GridBagLayoutPanel();
        jb1 = new JButton("CENTER ALIGNMENT");
        panel.addComponent(jb1,0,0,1,1,GridBagConstraints.NONE,0.0D,0.0D,GridBagConstraints.CENTER);
        jb2 = new JButton("WEST");
        panel.addComponent(jb2,1,0,2,2,GridBagConstraints.BOTH,0.0D,0.0D,GridBagConstraints.WEST);
        jb3 = new JButton("EAST");
        panel.addComponent(jb3,3,0,1,1,GridBagConstraints.NONE,0.0D,0.0D,GridBagConstraints.EAST);
        jb4 = new JButton("4");
        panel.addComponent(jb4,4,0,1,1,GridBagConstraints.HORIZONTAL,0.0D,0.0D,GridBagConstraints.CENTER);
        jb5 = new JButton("Button 5");
        panel.addComponent(jb5,5,1,1,1,GridBagConstraints.NONE,0.0D,0.0D,GridBagConstraints.CENTER);
        
        this.getContentPane().add(panel, BorderLayout.CENTER);
    }
}

Succes ermee :)

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
er zijn ook andere managers die ik veel liever gebruik : de cel - layout manager bijvoorbeeld is vaak veel handiger dan de GridBag (die toch wel tamelijk rot om echt juist te krijgen). Zelf heb ik voor die CelLayout een <xml> parsertje geschreven zodat je het gewoon als html table kan beschouwen. Deze layout zit er niet standaard in maar effe googlen en je hebt em zo. (leuke eraan is dat je dus minimumwidth/height/ preferreed/fill kunt doen)...

Verwijderd

Topicstarter
Soultaker schreef op 29 May 2003 @ 20:40:

Dat kan niet met een GridBagLayout. Wel kun je een component met een bepaalde minimumbreedte in de cel stoppen dan zal de layout manager ook proberen de cel minimaal zo breed te maken (als dat kan).
Als ik met setsize(int, int) het jtextfield een grootte opgeef, wordt dit nog steeds genegeerd. Is setsize niet de goede methode voor het vastzetten van de breedte van een jtextfield?

  • momania
  • Registratie: Mei 2000
  • Laatst online: 10:59

momania

iPhone 30! Bam!

Verwijderd schreef op 30 May 2003 @ 11:47:
[...]


Als ik met setsize(int, int) het jtextfield een grootte opgeef, wordt dit nog steeds genegeerd. Is setsize niet de goede methode voor het vastzetten van de breedte van een jtextfield?
Nee, je moet je miminumSize, preferredSize en maximumSize gebruiken.
Bij voorkeur gebruik ik zelf alleen de 1e 2 en vaak alleen maar de 2e

Neem je whisky mee, is het te weinig... *zucht*

Pagina: 1