2017-08-04 9 views
1

J'ai une classe qui crée des éléments pour une grille dans un GridLayout, qui consiste essentiellement en 4 panneaux qui sont emballés ensemble. Je voulais que l'un des panneaux (qui contient un JTextArea) soit repliable car il est assez détaillé et je ne veux pas qu'il occupe autant d'espace sur l'écran. Naturellement, je suis tombé sur la bibliothèque SwingX et utilisé le JXCollapsiblePane pour le faire, et même si cela fonctionne comme prévu, il semble que cela affecte tous les autres JXCollapsiblePanes chaque fois que je clique sur le bouton bascule sur un seul d'entre eux. Il ne les ouvre pas réellement, mais le fait que la fenêtre se dilate pour s'adapter à l'espace comme s'ils étaient ouverts. Je peux prendre des photos si vous voulez une meilleure description, mais plus tard. Comment puis-je faire en sorte qu'il ne le fasse pas? Je suis sûr que je n'utilise aucun attribut statique, donc je ne suis pas sûr de savoir pourquoi. Sur une note de côté, si quelqu'un pouvait me dire si ce style de codage est correct (je pense que ce que je fais est vraiment inefficace avec les panneaux super-imbriqués, nouveau pour Swing) ce serait bien.JXCollapsiblePane de SwingX dans une classe affecte tous les autres volets créés dans d'autres objets créés par la classe

Voici les extraits de code pertinents de mon projet:

 JXCollapsiblePane collapsiblePane = new JXCollapsiblePane(); 
     JButton toggle = new JButton(collapsiblePane.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION)); 
     toggle.addActionListener(e -> { 
      toggle.setText(collapsiblePane.isCollapsed() ? "▼" : "▶"); 
     }); 
     toggle.setText("▶"); 
     toggle.setPreferredSize(new Dimension(20, 20)); 
     Border emptyBorder = BorderFactory.createEmptyBorder(); 
     toggle.setBorder(emptyBorder); 
     resultTextPanel.add(toggle); 
     collapsiblePane.setCollapsed(true); 
     collapsiblePane.setSize(250, 60); 
     gridElemPanel.add(resultTextPanel, BorderLayout.NORTH); 
     ... 
     if (ngramText != null && !ngramText.contains("null")) { 
      JTextArea ngramLabel = new JTextArea(ngramText); 
      ngramLabel.setLineWrap(true); 
      ngramLabel.setWrapStyleWord(true); 
      ngramLabel.setFont(new Font("Courier", Font.PLAIN, 12)); 
      JScrollPane scrollPane = new JScrollPane(ngramLabel); 
      scrollPane.setPreferredSize(new Dimension(250, 60)); 
      scrollPane.getHorizontalScrollBar().setUnitIncrement(16); 
      collapsiblePane.add(scrollPane); 
      collapsiblePane.setPreferredSize(scrollPane.getPreferredSize()); 
      gridElemPanel.add(collapsiblePane, BorderLayout.SOUTH); 
     } 
+2

[GridLayout] (https://docs.oracle.com/javase/7/docs/api/java/awt/GridLayout.html): "** Le conteneur est divisé en rectangles de taille égale **". quand vous en changez un, tout change en conséquence. – c0der

+0

Ahhh, ça a du sens. Y a-t-il une solution de contournement que je pourrais faire si? Je préfère garder ça à quoi ça ressemble parce que ça a l'air sympa. Peut-être que si je pouvais le faire, il commencerait avec tous les objets en expansion, car comme c'est le cas actuellement, chaque taille d'élément de la grille est réduite à la taille de la boîte et lorsque vous agrandissez quelque chose, elle redimensionne toutes les cases. pour devenir la même taille. EDIT: Je me suis juste fatigué de faire BoxLayout et cela semble faire l'affaire, je suppose. Merci pour le conseil. – Chuck67322

Répondre

1

GridLayout:

Le conteneur est divisé en rectangles de taille égale

donc quand vous changez un, tout change en conséquence.

Si vous avez besoin de plus de flexibilité (à un prix plus complexe), pensez à GridBagLayout.

+0

Je viens de faire BoxLayout et ça marche comme je veux. Merci quand même. – Chuck67322