Comment créer une mise en page réactive dans Java Swing

J’affiche une liste de paires de valeurs clés dans un swing JPanel. La clé est affichée dans un JLabel et la valeur dans un JTextField. Il y a assez de place sur le panneau pour afficher 1 ou 2 colonnes des paires clé-valeur en fonction de la taille du parent JFrame. Je voudrais afficher 2 colonnes de paires clé-valeur sauf si le panneau devient trop petit. Ensuite, je veux passer à une colonne. Est-ce possible dans Swing sans écrire mon propre gestionnaire de disposition personnalisé?

Le fait de placer chaque paire de valeurs de clé sur son propre panneau et d’append les panneaux à une disposition de stream ferait ce que je voulais faire, sauf que les étiquettes ne seraient pas alignées les unes avec les autres et les champs de texte ne s’aligneraient pas les uns avec les autres, de sorte que leur apparence serait terrible. Y a-t-il une meilleure manière de faire cela?

Modifier:

Voici à quoi cela ressemblerait. Si le panneau est assez grand, affichez deux colonnes. Sinon, affichez une colonne.

2 colonnes:

Some Key _______________ Key 2 ________________ Another Key _______________ Yet Another Key ________________ Key 5 _______________ Key 6 ________________ 

1 colonne

  Some Key _______________ Key 2 _______________ Another Key _______________ Yet Another Key _______________ Key 5 _______________ Key 6 ________________ 

Vous pouvez utiliser votre idée FlowLayout et continuer à aligner les étiquettes / champs de texte. Ajoutez une entretoise à chaque panneau clé / valeur de la taille de votre étiquette la plus longue pour forcer le champ de texte vers la droite de la même quantité sur chaque panneau. Quelque chose comme:

 import java.awt.*; import javax.swing.*; public class Test implements Runnable { private Ssortingng[] keys = {"One", "Twoooooo", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve"}; private Ssortingng[] values = {"Apple", "Boy", "Cat", "Denmark", "Elephant", "Foo", "Hello", "Igloo", "Jug", "Kangaroo", "Lip", "Now"}; public static void main(Ssortingng[] args) { SwingUtilities.invokeLater(new Test()); } public void run() { JPanel panel = new JPanel(new FlowLayout()); GridBagConstraints gbc; JTextField textField = null; int maxWidth = 0; JLabel[] labels = new JLabel[keys.length]; for (int i = 0; i < keys.length; i++) { labels[i] = new JLabel(keys[i]); maxWidth = Math.max(labels[i].getPreferredSize().width, maxWidth); } JPanel[] panels = new JPanel[keys.length]; for (int i = 0; i < keys.length; i++) { panels[i] = new JPanel(new GridBagLayout()); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.anchor = GridBagConstraints.EAST; gbc.insets = new Insets(1,1,1,1); panels[i].add(Box.createHorizontalStrut(maxWidth), gbc); gbc.gridy = 1; panels[i].add(labels[i], gbc); textField = new JTextField(10); textField.setText(values[i]); gbc.gridx = 1; panels[i].add(textField, gbc); panel.add(panels[i]); } JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(panel); frame.setSize(240, 400); frame.setLocationRelativeTo(null); frame.setVisible(true); } }