Swing中JScrollPane添加JPanel设置setPreferredSize问题

    xiaoxiao2021-04-16  36

    [java]  view plain  copy panel = new JPanel(new FlowLayout(FlowLayout.LEFT));   [java]  view plain  copy Dimension ds = new Dimension(100100);   panel.setPreferredSize(ds);   jspane.setViewportView(panel);  

    上面的代码是在jspane的滚动视图组件中添加一个流式布局的JPanel。然后设置一个panel的prefSize首选值。

    在Java api中这样解释:

    [java]  view plain  copy setPreferredSize   public void setPreferredSize(Dimension preferredSize)设置此组件的首选大小。如果 preferredSize为 null,则要求 UI 提供首选大小。   就是说如果不提供这个值,ui会进行计算并设置这个值,这里,会根据jspane的ui来设置值。(默认的JScrollPane组件是自动添加横竖滚动条的)

    panel中添加组件,默认FlowLayout布局器会进行流式布局,这里定义是左对齐。如果没有设置prefSize值,则使用根据JScrollPane组件jspane的ui自动进行计算的首选大小prefSize。而JScrollPane组件默认是会进行滚动显示,所以,如果panel中添加的组件过多导致超出了panel的宽度,JScrollPane的ui会计算一个合适的prefSize值来提供给panel组件,此时,panel的流布局会一直在同一水平方向布局,而不会换行。如下图显示:

    就算取消了JScrollPane的横向滚动条,panel也不会进行换行布局,此时获取panel的prefSize也会远远大于panel的默认长宽

    [java]  view plain  copy java.awt.Dimension[width=6845,height=110]  

    Component中的preferredSize()方法

    public Dimension preferredSize() {           /* Avoid grabbing the lock if a reasonable cached size value           * is available.           */           Dimension dim = prefSize;//获取默认prefSize           if (dim == null || !(isPreferredSizeSet() || isValid())) {               synchronized (getTreeLock()) {                   prefSize = (peer != null) ?                       peer.getPreferredSize() :                       getMinimumSize();                   dim = prefSize;               }           }           return new Dimension(dim);       }

    此时设置panel的prefSize值,JScrollPane就不会计算panel的大小,panel的组件如果超出panel的宽度,流布局就会自动转行。 不过,这样设置的效果是,JScrollPane的竖方向也不会计算panel的大小,一旦panel的组件过多,导致超出panel的高度,滚动条也不会显示,可以手动计算panel的组件数量布局,然后设置panel的prefSize。

    private void resize()   {      int nums = panel.getComponentCount();  //组件数量    //100 添加的组件长和宽, 5是流布局FlowLayout的默认组件间隔      int h = (nums / (panel.getWidth() / (100+5))) * (100 + 5);      panel.setPreferredSize(new Dimension(100, h));     //手动设置panel的首选大小,如果不需要横向滚动,width的值可以设置和前面默认一样      updateUI();   }

    原文地址:http://blog.csdn.net/sujudz/article/details/8916951

    转载请注明原文地址: https://ju.6miu.com/read-672872.html

    最新回复(0)