Question

J'ai un JPanel et je crée, de façon dynamique, JCheckBoxes à l'intérieur. Ceux-ci doivent être ajoutés JCheckBoxes toujours côte à côte. Dans le cas où il y a plus d'espace à insérer dans le côté, une nouvelle ligne de JCheckBoxes est créé, comme dans un simple éditeur de texte.

Cela se passe parfaitement. Mais ...

Je mis la disposition sur ce JPanel à FlowLayout, exactement ce que je veux.

Le problème évident est qu'une fenêtre a un espace limité. Donc, une bonne solution est: L'insertion de ce JPanel dans un JScrollPane, l et la fabrication qui se produisent seulement dans le défilement vertical. Mais j'ai des problèmes. Bien que vous ne pouvez faire qu'une barre de défilement verticale apparaît, les éléments sont toujours ajoutés côté « pour toujours » côte à côte. Et le défilement vertical ne fonctionne tout simplement pas, seulement horizontalement.

J'ai essayé plusieurs façons de faire défiler seulement verticalement, mais rien ne fonctionnait (si elle avait travaillé, je ne serais pas ici:]).

Alors, quelqu'un at-il eu un problème similaire, et peut me aider?

Je serai très reconnaissant envers ceux qui me aider.

Plus.

Était-ce utile?

La solution

J'ai eu affaire avec le même problème avec ScrollPanes et FlowLayouts. J'ai trouvé la meilleure solution est d'utiliser une version modifiée de FlowLayout qui prend en compte les changements verticaux. Voici le code pour la mise en un. Vous pouvez l'inclure dans votre projet et l'appeler comme un FlowLayout, mais il va vraiment agréable de travailler avec un scrollpane.

import java.awt.*;

/**
  * A modified version of FlowLayout that allows containers using this
  * Layout to behave in a reasonable manner when placed inside a
  * JScrollPane

  * @author Babu Kalakrishnan
  * Modifications by greearb and jzd
  */

 public class ModifiedFlowLayout extends FlowLayout {
       public ModifiedFlowLayout() {
              super();
           }

           public ModifiedFlowLayout(int align) {
              super(align);
           }
       public ModifiedFlowLayout(int align, int hgap, int vgap) {
          super(align, hgap, vgap);
       }

       public Dimension minimumLayoutSize(Container target) {
          // Size of largest component, so we can resize it in
          // either direction with something like a split-pane.
          return computeMinSize(target);
       }

       public Dimension preferredLayoutSize(Container target) {
          return computeSize(target);
       }

       private Dimension computeSize(Container target) {
          synchronized (target.getTreeLock()) {
             int hgap = getHgap();
             int vgap = getVgap();
             int w = target.getWidth();

             // Let this behave like a regular FlowLayout (single row)
             // if the container hasn't been assigned any size yet
             if (w == 0) {
                w = Integer.MAX_VALUE;
             }

             Insets insets = target.getInsets();
             if (insets == null){
                insets = new Insets(0, 0, 0, 0);
             }
             int reqdWidth = 0;

             int maxwidth = w - (insets.left + insets.right + hgap * 2);
             int n = target.getComponentCount();
             int x = 0;
             int y = insets.top + vgap; // FlowLayout starts by adding vgap, so do that here too.
             int rowHeight = 0;

             for (int i = 0; i < n; i++) {
                Component c = target.getComponent(i);
                if (c.isVisible()) {
                   Dimension d = c.getPreferredSize();
                   if ((x == 0) || ((x + d.width) <= maxwidth)) {
                      // fits in current row.
                      if (x > 0) {
                         x += hgap;
                      }
                      x += d.width;
                      rowHeight = Math.max(rowHeight, d.height);
                   }
                   else {
                      // Start of new row
                      x = d.width;
                      y += vgap + rowHeight;
                      rowHeight = d.height;
                   }
                   reqdWidth = Math.max(reqdWidth, x);
                }
             }
             y += rowHeight;
             y += insets.bottom;
             return new Dimension(reqdWidth+insets.left+insets.right, y);
          }
       }

       private Dimension computeMinSize(Container target) {
          synchronized (target.getTreeLock()) {
             int minx = Integer.MAX_VALUE;
             int miny = Integer.MIN_VALUE;
             boolean found_one = false;
             int n = target.getComponentCount();

             for (int i = 0; i < n; i++) {
                Component c = target.getComponent(i);
                if (c.isVisible()) {
                   found_one = true;
                   Dimension d = c.getPreferredSize();
                   minx = Math.min(minx, d.width);
                   miny = Math.min(miny, d.height);
                }
             }
             if (found_one) {
                return new Dimension(minx, miny);
             }
             return new Dimension(0, 0);
          }
       }

    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top