`

swing-FlowLayout垂直布局

 
阅读更多
package layout;

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

import javax.swing.JButton;
import javax.swing.JFrame;

/**
 * VerticalFlowLayout is similar to FlowLayout except it lays out components
 * vertically. Extends FlowLayout because it mimics much of the behavior of the
 * FlowLayout class, except vertically. An additional feature is that you can
 * specify a fill to edge flag, which causes the VerticalFlowLayout manager to
 * resize all components to expand to the column width Warning: This causes
 * problems when the main panel has less space that it needs and it seems to
 * prohibit multi-column output. Additionally there is a vertical fill flag,
 * which fills the last component to the remaining height of the container.
 */
public class VFlowLayout extends FlowLayout
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * Specify alignment top.
	 */
	public static final int TOP = 0;

	/**
	 * Specify a middle alignment.
	 */
	public static final int MIDDLE = 1;

	/**
	 * Specify the alignment to be bottom.
	 */
	public static final int BOTTOM = 2;

	int hgap;
	int vgap;
	boolean hfill;
	boolean vfill;

	public static void main(String[] args)
	{
		System.out.println("Just for test ...");
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(0, 0, 600, 600);
		frame.setLayout(new VFlowLayout());
		
		int i = 0;
		frame.add(new JButton(String.valueOf(i++)));
		frame.add(new JButton(String.valueOf(i++)));
		frame.add(new JButton(String.valueOf(i++)));
		frame.add(new JButton(String.valueOf(i++)));
		frame.add(new JButton(String.valueOf(i++)));
		frame.add(new JButton(String.valueOf(i++)));
		frame.add(new JButton(String.valueOf(i++)));
		frame.add(new JButton(String.valueOf(i++)));
		frame.add(new JButton(String.valueOf(i++)));
		frame.add(new JButton(String.valueOf(i++)));
		frame.add(new JButton(String.valueOf(i++)));
		
		frame.setVisible(true);
	}
	
	/**
	 * Construct a new VerticalFlowLayout with a middle alignment, and the fill
	 * to edge flag set.
	 */
	public VFlowLayout()
	{
		this(TOP, 5, 5, true, false);
	}

	/**
	 * Construct a new VerticalFlowLayout with a middle alignment.
	 * 
	 * @param hfill
	 *            the fill to edge flag
	 * @param vfill
	 *            the vertical fill in pixels.
	 */
	public VFlowLayout(boolean hfill, boolean vfill)
	{
		this(TOP, 5, 5, hfill, vfill);
	}

	/**
	 * Construct a new VerticalFlowLayout with a middle alignment.
	 * 
	 * @param align
	 *            the alignment value
	 */
	public VFlowLayout(int align)
	{
		this(align, 5, 5, true, false);
	}

	/**
	 * Construct a new VerticalFlowLayout.
	 * 
	 * @param align
	 *            the alignment value
	 * @param hfill
	 *            the horizontalfill in pixels.
	 * @param vfill
	 *            the vertical fill in pixels.
	 */
	public VFlowLayout(int align, boolean hfill, boolean vfill)
	{
		this(align, 5, 5, hfill, vfill);
	}

	/**
	 * Construct a new VerticalFlowLayout.
	 * 
	 * @param align
	 *            the alignment value
	 * @param hgap
	 *            the horizontal gap variable
	 * @param vgap
	 *            the vertical gap variable
	 * @param hfill
	 *            the fill to edge flag
	 * @param vfill
	 *            true if the panel should vertically fill.
	 */
	public VFlowLayout(int align, int hgap, int vgap, boolean hfill, boolean vfill)
	{
		setAlignment(align);
		this.hgap = hgap;
		this.vgap = vgap;
		this.hfill = hfill;
		this.vfill = vfill;
	}

	/**
	 * Returns the preferred dimensions given the components in the target
	 * container.
	 * 
	 * @param target
	 *            the component to lay out
	 */
	public Dimension preferredLayoutSize(Container target)
	{
		Dimension tarsiz = new Dimension(0, 0);

		for (int i = 0; i < target.getComponentCount(); i++)
		{
			Component m = target.getComponent(i);
			
			if (m.isVisible())
			{
				Dimension d = m.getPreferredSize();
				tarsiz.width = Math.max(tarsiz.width, d.width);
				
				if (i > 0)
				{
					tarsiz.height += hgap;
				}
				
				tarsiz.height += d.height;
			}
		}
		
		Insets insets = target.getInsets();
		tarsiz.width += insets.left + insets.right + hgap * 2;
		tarsiz.height += insets.top + insets.bottom + vgap * 2;
		
		return tarsiz;
	}

	/**
	 * Returns the minimum size needed to layout the target container.
	 * 
	 * @param target
	 *            the component to lay out.
	 * @return the minimum layout dimension.
	 */
	public Dimension minimumLayoutSize(Container target)
	{
		Dimension tarsiz = new Dimension(0, 0);

		for (int i = 0; i < target.getComponentCount(); i++)
		{
			Component m = target.getComponent(i);
			
			if (m.isVisible())
			{
				Dimension d = m.getMinimumSize();
				tarsiz.width = Math.max(tarsiz.width, d.width);
				
				if (i > 0) 
				{
					tarsiz.height += vgap;
				}
				
				tarsiz.height += d.height;
			}
		}
		
		Insets insets = target.getInsets();
		tarsiz.width += insets.left + insets.right + hgap * 2;
		tarsiz.height += insets.top + insets.bottom + vgap * 2;
		
		return tarsiz;
	}

	/**
	 * Set true to fill vertically.
	 * 
	 * @param vfill
	 *            true to fill vertically.
	 */
	public void setVerticalFill(boolean vfill)
	{
		this.vfill = vfill;
	}

	/**
	 * Returns true if the layout vertically fills.
	 * 
	 * @return true if vertically fills the layout using the specified.
	 */
	public boolean getVerticalFill()
	{
		return vfill;
	}

	/**
	 * Set to true to enable horizontally fill.
	 * 
	 * @param hfill
	 *            true to fill horizontally.
	 */
	public void setHorizontalFill(boolean hfill)
	{
		this.hfill = hfill;
	}

	/**
	 * Returns true if the layout horizontally fills.
	 * 
	 * @return true if horizontally fills.
	 */
	public boolean getHorizontalFill()
	{
		return hfill;
	}

	/**
	 * places the components defined by first to last within the target
	 * container using the bounds box defined.
	 * 
	 * @param target
	 *            the container.
	 * @param x
	 *            the x coordinate of the area.
	 * @param y
	 *            the y coordinate of the area.
	 * @param width
	 *            the width of the area.
	 * @param height
	 *            the height of the area.
	 * @param first
	 *            the first component of the container to place.
	 * @param last
	 *            the last component of the container to place.
	 */
	private void placethem(Container target, int x, int y, int width, int height, int first, int last)
	{
		int align = getAlignment();
		
		if (align == MIDDLE)
		{
			y += height / 2;
		}
		
		if (align == BOTTOM)
		{
			y += height;
		}
		
		for (int i = first; i < last; i++)
		{
			Component m = target.getComponent(i);
			Dimension md = m.getSize();
			
			if (m.isVisible())
			{
				int px = x + (width - md.width) / 2;
				m.setLocation(px, y);
				y += vgap + md.height;
			}
		}
	}

	/**
	 * Lays out the container.
	 * 
	 * @param target
	 *            the container to lay out.
	 */
	public void layoutContainer(Container target)
	{
		Insets insets = target.getInsets();
		int maxheight = target.getSize().height	- (insets.top + insets.bottom + vgap * 2);
		int maxwidth = target.getSize().width - (insets.left + insets.right + hgap * 2);
		int numcomp = target.getComponentCount();
		int x = insets.left + hgap, y = 0;
		int colw = 0, start = 0;

		for (int i = 0; i < numcomp; i++)
		{
			Component m = target.getComponent(i);
			
			if (m.isVisible()) 
			{
				Dimension d = m.getPreferredSize();
				
				// fit last component to remaining height
				if ((this.vfill) && (i == (numcomp - 1))) 
				{
					d.height = Math.max((maxheight - y), m.getPreferredSize().height);
				}

				// fit component size to container width
				if (this.hfill)
				{
					m.setSize(maxwidth, d.height);
					d.width = maxwidth;
				} 
				else
				{
					m.setSize(d.width, d.height);
				}

				if (y + d.height > maxheight)
				{
					placethem(target, x, insets.top + vgap, colw, maxheight - y, start, i);
					y = d.height;
					x += hgap + colw;
					colw = d.width;
					start = i;
				} 
				else
				{
					if (y > 0)
					{
						y += vgap;
					}
					
					y += d.height;
					colw = Math.max(colw, d.width);
				}
			}
		}
		
		placethem(target, x, insets.top + vgap, colw, maxheight - y, start,	numcomp);
	}
}


分享到:
评论

相关推荐

    java swing-FlowLayout的使用

    FlowLayout 是 Java Swing 库提供的一种布局管理器,用于在容器中按照水平或垂直方向依次排列组件。 FlowLayout 的特点如下: 组件按照添加的顺序依次排列,并自动换行。 默认情况下,组件在容器中居中对齐。 组件...

    JAVA-SWING-4中布局方式.doc

    FlowLayout 是 JAVA-SWING-4 中的一种基本布局管理器,它将组件水平或垂直地排列在容器中。FlowLayout 提供了多种对齐方式,包括居中、左对齐、右对齐、leading 对齐和 trailing 对齐。 在 FlowLayout 中,组件可以...

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

    Java Swing 组件布局管理器之 FlowLayout(流式布局)入门教程 Java Swing 组件布局管理器中有多种布局管理器,今天我们主要介绍 FlowLayout(流式布局),它是最简单、最基础的一个布局管理器。 FlowLayout 也称为...

    flowlayout 顺序布局,自动换行

    FlowLayout是一种常见的布局管理器,它是Java Swing和Android等GUI框架中的一个重要组成部分。在这些平台上,FlowLayout用于组织组件(如按钮、文本框等)在容器内的排列方式。它按照从左到右,从上到下的顺序来放置...

    JavaSwing FlowLayout 流式布局的实现

    JavaSwing FlowLayout 流式布局的实现 JavaSwing 中的 FlowLayout 是一种常用的布局管理器,它可以将组件按照水平方向依次排列,自动换行排列。下面是 FlowLayout 的详细介绍和使用实例。 一、概述 FlowLayout 是...

    流式布局 FlowLayout

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

    Java Swing - 常识篇 之 LayoutManager

    4. **BoxLayout**:沿X轴或Y轴将组件进行堆叠,可以设置为水平或垂直布局。 5. **CardLayout**:允许你在同一容器中切换多个组件,就像卡片一样,一次只显示一张。 6. **GridBagLayout**:最灵活的布局管理器,...

    java FlowLayout布局管理

    总的来说,`FlowLayout`是Java Swing中最基础的布局管理器之一,适用于创建简洁的用户界面,尤其适合那些需要按顺序显示元素的应用场景。然而,对于更复杂的布局需求,开发者可能会选择其他的布局管理器,如`...

    FlowLayout:流式布局

    在Java Swing中,FlowLayout是Container类的默认布局管理器。 FlowLayout有三个主要参数:align(对齐方式)、hgap(水平间距)和vgap(垂直间距)。这些参数可以通过构造函数或setAlignment、setHgap和setVgap方法...

    FlowLayout布局

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

    FlowLayout

    在Java Swing和AWT库中,布局管理器是控制窗口小部件(如按钮、文本框等)如何在容器(如JFrame或JPanel)中布局的关键工具。FlowLayout是最简单的一种布局管理器,它按照从左到右、从上到下的顺序排列组件,当一行...

    关于Swing的布局

    Swing不仅支持基础的布局管理器如FlowLayout、BorderLayout等,还允许用户自定义布局管理器以满足更为复杂的需求。本文将基于给定的代码片段来探讨Swing中的布局管理机制及其具体应用。 ### Swing布局管理器简介 ...

    flowlayout流布局

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

    Java中FlowLayout布局管理器.pdf

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

    java_swing窗体布局

    Java Swing 窗体布局是Java图形用户界面(GUI)设计的重要组成部分,它决定了组件在窗口中的排列方式和外观。Swing提供了多种布局管理器,每种都有其独特的特性和用途,下面我们将详细讨论这些布局管理器。 1. **...

    JAVASWIG中布局方式.doc

    Java Swing 中的布局管理器是构建用户界面时不可或缺的部分,它们决定了组件在窗口或容器中的排列方式。本文将详细介绍两种常用的布局管理器:FlowLayout 和 BorderLayout。 1. 流式布局(FlowLayout) FlowLayout ...

    流式布局 flowLayout

    流式布局(FlowLayout)是Java Swing中的一种布局管理器,用于组织组件在容器中的位置。在流式布局中,组件会按照从左到右、从上到下的顺序依次排列,当一行填满后,组件会自动换行。这种布局方式非常适合创建简单的...

    (完整word版)Java-swing布局详解(附示例图).doc

    在本文中,我们将详细介绍 Java Swing 中的布局管理器,包括 FlowLayout、BorderLayout、BoxLayout、CardLayout、GridLayout 和 GridBagLayout。 FlowLayout 是 Java Swing 中最简单的布局管理器。它按照从左到右的...

Global site tag (gtag.js) - Google Analytics