2017-04-10 1 views
0

Pour l'interface graphique d'une application de calcul que je fais, j'ai une grille de JButton objets, où tous sont de la même taille, sauf l'un est le double de la largeur des autres. Il devrait ressembler à ceci (à l'exception des lignes serait droit):Pourquoi les composants liés ne peuvent-ils pas être redimensionnés dans GroupLayout?

enter image description here

Ma première pensée serait que je définir une taille pour les JButton objets (appelons-le CELL_SIZE), puis définissez la préférence la taille des boutons à CELL_SIZE, sauf le plus long bouton aurait CELL_SIZE * 2. Cela fonctionne jusqu'à ce que vous redimensionniez la fenêtre. Je veux que les boutons se redimensionnent pour que, quelles que soient les dimensions de la fenêtre, tous les boutons aient la même taille, sauf la plus longue. J'ai donc essayé d'utiliser linkSize, avec tous les boutons sauf le long comme arguments. Mais les boutons ne se redimensionneraient pas! Je lis ensuite dans le javadoc que linkSize empêche les composants d'être redimensionnés. Pourquoi est-ce? Puis-je utiliser cette méthode pour accomplir cette mise en page, ou ai-je besoin d'autre chose? Ci-dessous est une classe que j'ai tapée pour démontrer le problème (l'application réelle est entassée avec d'autres fonctionnalités en dehors de la mise en page) Il a seulement 5 boutons et sert à représenter la zone 3x2 inférieure gauche de l'image.

import javax.swing.GroupLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

class A extends JPanel{ 

    public static final int CELL_SIZE = 32; 
    JButton b1 = new JButton("1"); 
    JButton b2 = new JButton("2"); 
    JButton b3 = new JButton("3"); 
    JButton b4 = new JButton("4"); 
    JButton b5 = new JButton("5"); 

    public A(){ 
     GroupLayout layout = new GroupLayout(this); 
     layout.setHorizontalGroup(layout.createSequentialGroup() 
      .addGroup(layout.createParallelGroup() 
       .addComponent(b1, 0, CELL_SIZE, Short.MAX_VALUE) 
       .addComponent(b2, 0, CELL_SIZE, Short.MAX_VALUE) 
      ).addGroup(layout.createParallelGroup() 
       .addGroup(layout.createSequentialGroup() 
        .addComponent(b3, 0, CELL_SIZE, Short.MAX_VALUE) 
        .addComponent(b4, 0, CELL_SIZE, Short.MAX_VALUE) 
       ) 
       .addComponent(b5, 0, CELL_SIZE * 2, Short.MAX_VALUE) 
      ) 
     ); 
     layout.setVerticalGroup(layout.createSequentialGroup() 
      .addGroup(layout.createParallelGroup() 
       .addComponent(b1, 0, CELL_SIZE, Short.MAX_VALUE) 
       .addComponent(b3, 0, CELL_SIZE, Short.MAX_VALUE) 
       .addComponent(b4, 0, CELL_SIZE, Short.MAX_VALUE) 
      ).addGroup(layout.createParallelGroup() 
       .addComponent(b2, 0, CELL_SIZE, Short.MAX_VALUE) 
       .addComponent(b5, 0, CELL_SIZE, Short.MAX_VALUE) 
      ) 
     ); 
     layout.linkSize(b1, b2, b3, b4); 
     setLayout(layout); 
    } 

    private static void createAndShowGUI(){ 
     JFrame f = new JFrame("GroupLayout Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new A()); 
     f.pack(); 
     f.setVisible(true); 
    } 

    public static void main(String[] args){ 
     SwingUtilities.invokeLater(new Runnable(){ 
      @Override 
      public void run(){ 
       createAndShowGUI(); 
      } 
     }); 
    } 

} 

EDIT: Si je l'appelle addComponent(component, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) et supprimer l'appel linkSize, puis les boutons tailles deviennent étranges. b1 et b2 deviennent plus larges que b3 et b4, mais pas aussi large que b5.

+0

GridBagLayout peut être une meilleure option ici, il a un support intégré pour la mise en page basée sur la grille, y compris les éléments couvrant plusieurs cellules comme vous l'avez décrit. – Charlie

Répondre

1

Oracle tutorial:

1) Pour forcer un composant à redimensionnable (permettre le rétrécissement et la croissance):

group.addComponent(component, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ... 

Cela permet au composant de redimensionner entre la taille zéro (minimum) à toutes les tailles (Short.MAX_VALUE comme taille maximale signifie "infini"). Si nous voulions que le composant ne rétrécisse pas en dessous de sa taille minimale par défaut, nous utiliserons GroupLayout.DEFAULT_SIZE au lieu de 0 dans le deuxième paramètre.

2) Pour faire une taille fixe composant (supprimer le redimensionnement):

group.addComponent(component, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, 
      GroupLayout.PREFERRED_SIZE) ... 

Je pense que vous devriez utiliser 1ère option.

+0

Si je fais cela, les composants ne sont pas redimensionnés correctement. 'b1' et' b2' sont plus larges que 'b3' et' b4', mais pas aussi larges que 'b5'. –