2010-11-16 3 views
0

У меня есть JPanel, и я создаю динамически JCheckBoxes внутри. Они должны быть добавлены JCheckBoxes всегда рядом. В случае, если в бок есть больше места, создается новая строка JCheckBoxes, как в простом текстовом редакторе.JPanel внутри JScrollPane

Это происходит отлично. Но ...

Я установил макет на этом JPanel FlowLayout, именно то, что я хочу.

Очевидная проблема заключается в том, что окно имеет ограниченное пространство. Поэтому хорошим решением является следующее: Вставка этого JPanel в JScrollPane, l и создание этого происходит только в вертикальной прокрутке. Но у меня проблемы. Хотя вы можете создать только вертикальную полосу прокрутки, элементы всегда добавляются «навсегда» бок о бок. И вертикальный свиток просто не работает, только по горизонтали.

Я пробовал много способов сделать свиток только вертикально, но ничего не сработало (если бы это сработало, меня бы здесь не было).

Итак, есть ли у кого-нибудь подобные проблемы и могут мне помочь?

Буду очень признателен тем, кто мне помогает.

Больше нет.

+2

Это попахивает плохой дизайн пользовательского интерфейса - JScrollPane, как правило, используется для обеспечения представления на стол или изображение, а не панель управления (в конце концов, сколько раз вы видели этот подход в Windows, MacOS и т.д.)? Лучшим подходом было бы разделение ваших элементов управления на нескольких вкладках или JPanels, сложенных с использованием CardLayout. – Adamski

ответ

4

Я занимался той же проблемой с ScrollPanes и FlowLayouts. Я нашел лучшее решение - использовать модифицированную версию FlowLayout, которая учитывает вертикальные изменения. Вот код для такого макета. Вы можете включить его в свой проект и называть его точно так же, как FlowLayout, однако на самом деле он будет работать с 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); 
      } 
     } 

    } 
+0

"@author Бабу Калакришнан - Модификации .." Ах да. Один из GUI-гуру usenet (ну, откуда я их знаю, в любом случае). ;) –

Смежные вопросы