我在做一个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); } } }
最终的效果(不想截图了,从网上找了个类似的效果图片贴上来吧):
相关推荐
在Android开发中,布局管理器是构建用户界面的关键部分,它们负责组织和定位屏幕上的各个组件。LinearLayout是最常见的布局之一,它按照垂直或水平方向排列其子视图。然而,当需要在一个容器中动态地展示数量不定且...
Qt FlowLayout布局是一种在Qt应用开发中用于组织控件的自定义布局管理器。与标准的Qt布局(如QVBoxLayout、QHBoxLayout和QGridLayout)不同,FlowLayout允许控件按照特定的方向(水平或垂直)流式排列,当空间不足时...
在Android开发中,布局设计是构建用户界面的关键环节。标题提到的“Android流式布局FlowLayout”是一种非标准但非常实用的布局方式,尤其在处理多个元素排列时,它能提供灵活且直观的解决方案。让我们深入了解一下...
* FlowLayout(int align, int hgap, int vgap):创建一个新的流布局管理器,它具有指定的对齐方式以及指定的水平和垂直间隙。 在使用 FlowLayout 时,需要了解它的基本方法,包括: * Void setAlignment(int align...
FlowLayout是Java GUI编程中的一种布局管理器,它用于组织组件在容器中的排列方式。在Java Swing和AWT库中,布局管理器是控制窗口小部件(如按钮、文本框等)如何在容器(如JFrame或JPanel)中布局的关键工具。...
其中,FlowLayout是一种特殊的布局管理器,用于在水平或垂直方向上动态排列子视图,当一行或一列填满后,会自动换行或换列。在本主题中,我们将深入探讨如何在Android项目中简单使用Material Design的FlowLayout。 ...
这个库的主要目的是处理那些在大小和数量上变化不定的控件,例如在一个应用中,用户可能需要动态添加或删除控件,而QtFlowlayout能够优雅地适应这种需求,实现类似瀑布流的效果。 在Qt框架中,通常使用QLayout来...
在Android开发中,流式布局(FlowLayout)是一种非常实用的布局方式,尤其适用于展示元素数量不确定,且需要根据屏幕尺寸自适应布局的情况。它的工作原理是像流水一样,当一行排列满后,会自然地换行到下一行继续...
Java中的FlowLayout布局管理器是Swing和AWT库中的一种基本布局策略,主要用于安排容器中的组件。当在JPanel或其他可以自定义布局的类中没有指定特定布局时,FlowLayout会成为默认的选择。这个布局管理器按照从上到下...
我们可以使用以下方式创建并设置一个FlowLayout: ```java FlowLayout flowLayout = new FlowLayout(); container.setLayout(flowLayout); ``` Flow Layout有三个主要参数,它们决定了组件之间的间隔和对齐方式: ...
流布局(FlowLayout)是Java Swing中的布局管理器之一,它是一种简单且常见的布局方式,用于组织组件时按照从左到右、从上到下的顺序排列。在容器空间不足时,流布局会自动换行,就像文字在纸上自然流动一样。在Java...
流式布局(FlowLayout)是Java Swing中的一种基本布局管理器,它按照从左到右、从上到下的顺序排列组件,当一行填满时,会在下一行开始新的排列。这种布局方式非常适合创建简单的用户界面,例如菜单栏或者一组按钮。在...
FlowLayout布局是Java Swing和AWT库中的一种基本布局管理器,它按照从左到右、从上到下的顺序排列组件,当一行无法容纳更多组件时,会自动换行到下一行,这种布局方式类似于文本的排列。在设计GUI界面时,FlowLayout...
在iOS开发中,尤其是使用Swift编程时,UI布局通常是一个关键点,Flow Layout可以帮助开发者实现类似瀑布流或者网格布局的效果,常用于展示图片或者商品列表等场景。 在iOS的UIKit框架中,我们通常使用Auto Layout或...
在Android开发中,布局管理器(Layout)是构建用户界面的关键组成部分,它们决定了视图(View)在屏幕上的排列方式。本篇文章将深入探讨“FlowLayout”——一种自定义的流式布局,它允许子视图按照从左到右、从上到...
在Android应用开发中,布局(Layout)是构建用户界面的核心元素。流式布局(FlowLayout)是一种特殊的布局方式,它允许子视图(View)按照从左到右、从上到下的顺序排列,当一行填满时,会自动换行到下一行。这种...
在Android开发中,布局管理器是构建用户界面的关键部分,它们决定了View在屏幕上的排列方式。`FlowLayout`是一种非标准的布局管理器,它允许子视图按照从左到右、自上而下的顺序流式排列,当一行填满时会自动换行,...