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?
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
.
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