`
shuaijie506
  • 浏览: 137789 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

类似于文档流的界面布局器:改进版的FlowLayout

阅读更多

 

我在做一个swing程序的时候想做一个类似于文档流的界面布局:

 

在一个JPanel里面动态放置一些面板(如jPanel),这些面板的尺寸大小都是相同的,考虑到不同尺寸屏幕的使用方便性来说,最好是当第一行满时,会自动换行到第二行。如果超过了当前JPanle的高度,则会出现上下滚动条。

 

一开始我用JPanel+FlowLayout.LEFT布局,倒是可以自动换行,但是发现当面板占据空间的高度高于JPanel的高度时,没有上下方向的滚动条出现,也就是说,下面的内容都被遮住了。

 

然后我在JPanel外面套了一个JScrollPane,却发现内容会一直往右边加,超出JPanel的宽度则出现横向的滚动条,与预想的效果相差较大。

 

于是我把JScrollPane的horizontalScrollBarPolicy属性设为ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER,这回横向滚动条没了,但是图片还是一直往右边加,超出JPanle宽度部分被遮住了。

 

经过上网检索资料,有一个方法可以实现,即继承FLowLayout类,并重写minimumLayoutSize方法和preferredLayoutSize方法,不过帖子上的代码有点小问题,后来我仔细研究代码和源码,进行了修正,最后实现了想要的效果,下面把正确的代码贴出来,供有此类需求的人使用

 

package com.xxxx.swing.layout;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Insets;

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) {  
        return computeSize(target, true);  
    }  
  
    public Dimension preferredLayoutSize(Container target) {  
        return computeSize(target, false);  
    }  
  
    private Dimension computeSize(Container target, boolean minimum) {  
        synchronized (target.getTreeLock()) {  
            int hgap = getHgap();  
            int vgap = getVgap();  
            int w = target.getWidth();  
  
            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;  
            int rowHeight = 0;  
  
            for (int i = 0; i < n; i++) {  
                Component c = target.getComponent(i);  
                if (c.isVisible()) {  
                    Dimension d =  
                            minimum ? c.getMinimumSize() : c.getPreferredSize();  
                    if ((x == 0) || ((x + d.width) <= maxwidth)) {  
                        if (x > 0) {  
                            x += hgap;  
                        }  
                        x += d.width;  
                        rowHeight = Math.max(rowHeight, d.height);  
                    } else {  
                        x = d.width;  
                        y += vgap + rowHeight;  
                        rowHeight = d.height;  
                    }  
                    reqdWidth = Math.max(reqdWidth, x);  
                }  
            }  
            y += rowHeight;
            return new Dimension(reqdWidth + insets.left + insets.right, y);  
        }  
    }  
}

 

最终的效果(不想截图了,从网上找了个类似的效果图片贴上来吧):

 



 

 

  • 大小: 97.6 KB
3
1
分享到:
评论
1 楼 freezingsky 2013-04-27  
有点意思!

相关推荐

    Android Flowlayout:LinearLayout内部控件自动换行

    在Android开发中,布局管理器是构建用户界面的关键部分,它们负责组织和定位屏幕上的各个组件。LinearLayout是最常见的布局之一,它按照垂直或水平方向排列其子视图。然而,当需要在一个容器中动态地展示数量不定且...

    Qt FlowLayout布局

    Qt FlowLayout布局是一种在Qt应用开发中用于组织控件的自定义布局管理器。与标准的Qt布局(如QVBoxLayout、QHBoxLayout和QGridLayout)不同,FlowLayout允许控件按照特定的方向(水平或垂直)流式排列,当空间不足时...

    Android流式布局FlowLayout

    在Android开发中,布局设计是构建用户界面的关键环节。标题提到的“Android流式布局FlowLayout”是一种非标准但非常实用的布局方式,尤其在处理多个元素排列时,它能提供灵活且直观的解决方案。让我们深入了解一下...

    Java Swing组件布局管理器之FlowLayout(流式布局)入门教程

    * FlowLayout(int align, int hgap, int vgap):创建一个新的流布局管理器,它具有指定的对齐方式以及指定的水平和垂直间隙。 在使用 FlowLayout 时,需要了解它的基本方法,包括: * Void setAlignment(int align...

    FlowLayout

    FlowLayout是Java GUI编程中的一种布局管理器,它用于组织组件在容器中的排列方式。在Java Swing和AWT库中,布局管理器是控制窗口小部件(如按钮、文本框等)如何在容器(如JFrame或JPanel)中布局的关键工具。...

    Android Material FlowLayout简单使用

    其中,FlowLayout是一种特殊的布局管理器,用于在水平或垂直方向上动态排列子视图,当一行或一列填满后,会自动换行或换列。在本主题中,我们将深入探讨如何在Android项目中简单使用Material Design的FlowLayout。 ...

    QtFlowlayout Qt流式布局器

    这个库的主要目的是处理那些在大小和数量上变化不定的控件,例如在一个应用中,用户可能需要动态添加或删除控件,而QtFlowlayout能够优雅地适应这种需求,实现类似瀑布流的效果。 在Qt框架中,通常使用QLayout来...

    android 流式布局 flowlayout

    在Android开发中,流式布局(FlowLayout)是一种非常实用的布局方式,尤其适用于展示元素数量不确定,且需要根据屏幕尺寸自适应布局的情况。它的工作原理是像流水一样,当一行排列满后,会自然地换行到下一行继续...

    Java中FlowLayout布局管理器.pdf

    Java中的FlowLayout布局管理器是Swing和AWT库中的一种基本布局策略,主要用于安排容器中的组件。当在JPanel或其他可以自定义布局的类中没有指定特定布局时,FlowLayout会成为默认的选择。这个布局管理器按照从上到下...

    flowlayout 顺序布局,自动换行

    我们可以使用以下方式创建并设置一个FlowLayout: ```java FlowLayout flowLayout = new FlowLayout(); container.setLayout(flowLayout); ``` Flow Layout有三个主要参数,它们决定了组件之间的间隔和对齐方式: ...

    flowlayout流布局

    流布局(FlowLayout)是Java Swing中的布局管理器之一,它是一种简单且常见的布局方式,用于组织组件时按照从左到右、从上到下的顺序排列。在容器空间不足时,流布局会自动换行,就像文字在纸上自然流动一样。在Java...

    流式布局 FlowLayout

    流式布局(FlowLayout)是Java Swing中的一种基本布局管理器,它按照从左到右、从上到下的顺序排列组件,当一行填满时,会在下一行开始新的排列。这种布局方式非常适合创建简单的用户界面,例如菜单栏或者一组按钮。在...

    FlowLayout布局

    FlowLayout布局是Java Swing和AWT库中的一种基本布局管理器,它按照从左到右、从上到下的顺序排列组件,当一行无法容纳更多组件时,会自动换行到下一行,这种布局方式类似于文本的排列。在设计GUI界面时,FlowLayout...

    swift-FlowLayout-适用于iOS的双向布局框架

    在iOS开发中,尤其是使用Swift编程时,UI布局通常是一个关键点,Flow Layout可以帮助开发者实现类似瀑布流或者网格布局的效果,常用于展示图片或者商品列表等场景。 在iOS的UIKit框架中,我们通常使用Auto Layout或...

    FlowLayout:流布局

    在Android开发中,布局管理器(Layout)是构建用户界面的关键组成部分,它们决定了视图(View)在屏幕上的排列方式。本篇文章将深入探讨“FlowLayout”——一种自定义的流式布局,它允许子视图按照从左到右、从上到...

    Android-Android流式布局FlowLayout实现关键字标签

    在Android应用开发中,布局(Layout)是构建用户界面的核心元素。流式布局(FlowLayout)是一种特殊的布局方式,它允许子视图(View)按照从左到右、从上到下的顺序排列,当一行填满时,会自动换行到下一行。这种...

    FlowLayout流式布局(仿热门标签)

    在Android开发中,布局管理器是构建用户界面的关键部分,它们决定了View在屏幕上的排列方式。`FlowLayout`是一种非标准的布局管理器,它允许子视图按照从左到右、自上而下的顺序流式排列,当一行填满时会自动换行,...

Global site tag (gtag.js) - Google Analytics