2010-11-16 82 views
0

我有一个JPanel,我在里面动态地创建了JCheckBoxes。 这些必须添加JCheckBoxes总是并排。如果在侧面插入更多空间,则会创建一个新的JCheckBoxes行,就像在简单的文本编辑器中一样。JScrollPane中的JPanel

这是完美的发生。但...

我将此JPanel的布局设置为FlowLayout,正是我想要的。

显而易见的问题是窗口空间有限。因此,一个很好的解决方案是:将此JPanel插入到JScrollPane中,并仅在垂直滚动中进行。 但我有问题。虽然您只能制作一个垂直滚动条,但这些项目总是并排添加“永远”。垂直滚动只是水平不起作用。

我已经尝试了很多方法来使滚动垂直,但没有任何工作(如果它已经工作,我不会在这里:])。

那么,有没有人有类似的问题,并可以帮助我?

我将非常感谢那些帮助我的人。

没有更多。

+2

这意味坏UI设计 - JScrollPane中通常用来提供一个视图到表或图像,而不是控制面板(毕竟,有多少次你见过在Windows,Mac系统等这种方法)?更好的方法是使用CardLayout将多个选项卡或JPanel堆叠在一起。 – Adamski 2010-11-16 21:00:24

回答

4

我处理了与ScrollPanes和FlowLayouts相同的问题。我发现最好的解决方案是使用FlowLayout的修改版本,该版本考虑垂直变化。这是这种布局的代码。您可以将它包含在您的项目中,并将其称为FlowLayout,但它实际上可以很好地处理滚动窗格。

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

“@作者Babu Kalakrishnan - 修改..”啊是的。其中一个usenet的GUI大师(好吧,无论如何我都知道他们在哪里)。 ;) – 2011-03-18 15:19:41