2010-10-01 4 views
2

J'essaie d'utiliser GridBagLayout pour positionner des étiquettes sur deux rangées, mais je veux que certaines étiquettes couvrent les deux rangées et que d'autres soient placées les unes sur les autres. Je dois utiliser GridBagLayout en raison de la fonctionnalité de dimensionnement proportionnelle dans les propriétés weightx et weighty de GridBagConstraints. Ceci est la mise en page Je cherche:Comment positionner des étiquettes de hauteurs variables sur deux lignes en utilisant GridBagLayout?

 
+----------+----------+----------+----------+ 
|   |   | labelC |   | 
| labelA | labelB |----------| labelD | 
|   |   | labelE |   | 
+----------+----------+----------+----------+ 

Le problème est que labelE est placé sous LabelA. Voici la partie mise en page de mon code:

 
GridBagLayout gridbag = new GridBagLayout(); 
GridBagConstraints c = new GridBagConstraints(); 
this.setLayout(gridBag); 
c.fill = GridBagConstraints.BOTH; 

c.gridwidth = 1; 
c.gridheight = 2; 
c.weighty = PANEL_HEIGHT; 
gridbag.setConstraints(labelA, c); 
this.add(labelA); 

gridbag.setConstraints(labelB, c); 
this.add(labelB); 

c.gridheight = 1; 
c.weighty = TOPROW_HEIGHT; 
gridbag.setConstraints(labelC, c); 
this.add(labelC); 

c.gridheight = 2; 
c.gridwidth = GridBagConstraints.REMAINDER; 
c.weighty = PANEL_HEIGHT; 
gridbag.setConstraints(labelD, c); 
this.add(labelD); 

c.gridheight = 1; 
c.gridwidth = 1; 
c.weighty = BOTROW_HEIGHT; 
gridbag.setConstraints(labelE, c); 
this.add(labelE); 

this.validate(); 

Des idées sur ce qui me manque?

Répondre

1

Vous pouvez utiliser gridx et gridy pour sélectionner votre position sur la grille:

GridBagLayout gridbag = new GridBagLayout(); 
    GridBagConstraints c = new GridBagConstraints(); 

    this.setLayout(gridbag); 

    c.fill = GridBagConstraints.BOTH; 

    c.gridwidth = 1; 
    c.gridheight = 2; 
    c.gridx = 0; 
    c.gridy = 0; 
    c.weighty = PANEL_HEIGHT; 
    gridbag.setConstraints(labelA, c); 
    this.add(labelA); 

    c.gridx = 1; 
    c.gridy = 0; 
    gridbag.setConstraints(labelB, c); 
    this.add(labelB); 

    c.gridx = 2; 
    c.gridy = 0; 
    c.gridheight = 1; 
    c.weighty = TOPROW_HEIGHT; 
    gridbag.setConstraints(labelC, c); 
    this.add(labelC); 


    c.gridx = 3; 
    c.gridy = 0; 
    c.gridheight = 2; 
    c.gridwidth = GridBagConstraints.REMAINDER; 
    c.weighty = PANEL_HEIGHT; 
    gridbag.setConstraints(labelD, c); 
    this.add(labelD); 

    c.gridx = 2; 
    c.gridy = 1; 
    c.fill = GridBagConstraints.VERTICAL; 
    c.gridheight = 1; 
    c.gridwidth = 1; 
    c.weighty = BOTROW_HEIGHT; 
    gridbag.setConstraints(labelE, c); 
    this.add(labelE); 

    this.validate(); 
+0

Bizarrement, 'gridx' et' gridy' ne sont pas utilisés dans l'exemple de code javadoc 'GridBagLayout', bien qu'il ait ce comportement. Cependant, cela fonctionne parfaitement. Merci, Colin! –

+0

Ne pas besoin de 'this.pack()', cependant. –

+0

@Erick Robertson, Vous avez raison, c'est juste un reste de mes tentatives de modification. Vous pouvez trouver quelques exemples de GridBagLayout sur les didacticiels Java: http://download.oracle.com/javase/tutorial/uiswing/layout/gridbag.html –

0

Ma suggestion est que vous pouvez faire ce qui précède sans utiliser GridBaglayout. Cela vous fera gagner beaucoup de temps et réduira le nombre de lignes. Pour votre problème particulier, vous pouvez réaliser ce que vous essayez d'utiliser une disposition de grille simple.

Créer un GridLayout de taille 1x4. Pour la troisième colonne, vous pouvez utiliser un autre GridLayout de taille 2x1. Mettez-les tous en place et vous devriez réaliser ce que vous voulez.

http://img823.imageshack.us/img823/5643/screenshot20101002at225.png

import java.awt.Component; 
import java.awt.GridLayout; 

import javax.swing.*; 

public class LayoutTest extends JFrame { 

    public LayoutTest(){ 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setLocationRelativeTo(null); 
     this.setSize(300,75); 
     this.add(getCustomPanel()); 
     this.setVisible(true); 
    } 

    private Component getCustomPanel() { 
     JPanel pnl = new JPanel(); 
     GridLayout gridLayout = new GridLayout(1,4); 
     pnl.setLayout(gridLayout); 

     JPanel subPanel = new JPanel(); 
     GridLayout subLayout = new GridLayout(2,1); 
     subPanel.setLayout(subLayout); 

     subPanel.add(new JLabel("labelC")); 
     subPanel.add(new JLabel("labelE")); 

     pnl.add(new JLabel("labelA")); 
     pnl.add(new JLabel("labelB")); 
     pnl.add(subPanel); 
     pnl.add(new JLabel("labelD")); 

     return pnl; 
    } 

    public static void main(String[] args) { 
     new LayoutTest(); 
    } 
} 
+0

Le problème que j'ai avec 'GridLayout' est le manque de réglage des hauteurs et des largeurs de chaque composant. Les parties 'weightx' et' weighty' de la classe 'GridBagConstraints' fonctionnent parfaitement pour la taille de ce panneau. J'ai omis le 'weightx' de l'exemple de code car il est sans rapport avec le problème. Pour cette raison, 'GridLayout' ne convient pas à mes besoins. Pardon. –

+0

Pas que je suis contre GridBagLayout. Je l'ai moi-même utilisé plusieurs fois. Mais quand vous commencez à coder sans l'aide d'un éditeur Swing comme Netbeans, le code devient vraiment fou avec un GridBagLayout. C'est la raison pour laquelle je pensais que je suggérerais GridLayout. De plus, pourquoi ne pas essayer Netbeans, il fait de la vraie magie .. Juste mes quelques centimes. – bragboy

+0

J'apprends beaucoup plus quand je le fais manuellement. Je n'aime généralement pas faire confiance à n'importe quel éditeur graphique pour écrire mon code. Je ne vois pas cela aussi dur - et le code va être de toute façon fou si je l'écris ou le génère. En général, j'utilise 'GroupLayout', en fait. C'est très puissant. –

1

Vous devez définir le gridx et gridy:

GridBagLayout gridbag = new GridBagLayout(); 
GridBagConstraints c = new GridBagConstraints(); 
this.setLayout(gridBag); 
c.fill = GridBagConstraints.BOTH; 

c.gridwidth = 1; 
c.gridheight = 2; 
c.gridx = 0; 
c.gridy = 0; 
c.weighty = PANEL_HEIGHT; 
gridbag.setConstraints(labelA, c); 
this.add(labelA); 

c.gridx = 1; 
c.gridy = 0; 
gridbag.setConstraints(labelB, c); 
this.add(labelB); 

c.gridx = 2; 
c.gridy = 0; 
c.gridheight = 1; 
c.weighty = TOPROW_HEIGHT; 
gridbag.setConstraints(labelC, c); 
this.add(labelC); 

c.gridx = 3; 
c.gridy = 0; 
c.gridheight = 2; 
c.gridwidth = GridBagConstraints.REMAINDER; 
c.weighty = PANEL_HEIGHT; 
gridbag.setConstraints(labelD, c); 
this.add(labelD); 

c.gridx = 2; 
c.gridy = 1; 
c.gridheight = 1; 
c.gridwidth = 1; 
c.weighty = BOTROW_HEIGHT; 
gridbag.setConstraints(labelE, c); 
this.add(labelE); 

this.validate(); 

espoir qui aide.

+0

Je voulais juste dire merci pour la solution. Vous et Colin avez répondu exactement au même moment. +1 –

+0

@Erick pas de problème, content de pouvoir vous aider. Le plus gros problème avec gridbag j'ai vu les gens ont exactement ceci - le problème de la colonne enjambant. Content de voir que ça a marché pour vous!:) – aperkins

0

La meilleure façon de résoudre ce problème (en utilisant GridBag) est d'avoir labelC et labelE dans un JPanel.

La façon la plus difficile de la résoudre est d'utiliser les contraintes gridx, gridy et gridheight. Donc, vous auriez

+---------------+--------------+----------+----------+ 
| gridy=0  | gridy=0  | gridy=0 | gridy=0 | 
|    |    | gridx=2 | gridx=3 | 
| gridx=0  | gridx=1  |----------|   | 
| gridheight=2 | gridheight=2 | gridy=1 |   |   
|    |    | gridx=2 |   | 
+---------------+--------------+----------+----------+ 
+0

Je ne comprends pas pourquoi c'est la façon la plus difficile. –

+0

juste plus de codage. C'est plus difficile, mais certainement la bonne solution. Le JPanel vous permet d'éviter de devoir vous soucier des valeurs de grille, etc., car il s'agit d'un élément unique. Les 2 éléments à l'intérieur seront alors définis en conséquence. – Codemwnci

Questions connexes