我的第二个FlowLayoutManager程序

本文展示了一个使用Java AWT库中的FlowLayout布局管理器的简单示例程序。该程序创建了一个包含多个按钮的面板,并将其放置在一个Frame窗口中。通过这个例子,读者可以了解如何在Java中使用FlowLayout来组织GUI组件。
package org.gan.awt;

import java.awt.Button;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
//import java.awt.Dialog;

import javax.swing.JOptionPane;

public class FlowLayoutManager
{
	
	public static void main(String[] args)
	{
		// 创建Frame对象
		Frame f = new Frame();
		// 创建panel容器
		Panel p = new Panel();
		p.add(new Button("1"));// 默认垂直居中,间距为5
		p.add(new Button("2"));
		p.add(new Button("3"));
		p.add(new Button("4"));
		p.add(new Button("5"));
		p.add(new Button("6"));
		p.add(new Button("7"));
		p.add(new Button("8"));

		// FlowLayout程序运行图片
		p.add(new Button("9"));
		f.add(p);
		// 设置Frame标题
		f.setTitle("我的第二个FlowLayoutManager程序");
		// 设置Frame尺寸,默认为(0,0)

		f.setSize(200, 200);
		// 设置是否可见,默认为false
		f.setVisible(true);

		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.out.println(e.toString());
//				Dialog d= new Dialog(this,"Do you want to exit?",true);
//				d.setVisible(true);
//				d.setSize(60,50);
//				System.exit(0);
				  int i=JOptionPane.showConfirmDialog(null, "是否退出?","提示:", JOptionPane.YES_NO_OPTION);
				  if(i==JOptionPane.OK_OPTION){
				   //System.out.println("打印了");
				   System.exit(0);
				  }else{
				   //System.out.println("没打印");
				  }
				  
			}
			
			public void windowOpened(WindowEvent e) {
				System.out.println(e.toString());
				//System.out.println("windowOpened");
			}

		    public void windowIconified(WindowEvent e) {
		    	System.out.println(e.toString());
		    //	System.out.println("windowIconified");
		    }

		    public void windowDeiconified(WindowEvent e) {
		    	System.out.println(e.toString());
		   // 	System.out.println("windowDeiconified");

		    }

		    public void windowActivated(WindowEvent e) {
		    	System.out.println(e.toString());
		 //   	System.out.println("windowActivated");

		    }

		    public void windowDeactivated(WindowEvent e) {
		    	System.out.println(e.toString());
		  //  	System.out.println("windowDeactivated");

		    }
		});
		
		
	}

}

在 Android 开发中,`FlowLayoutmanager` 并是一个官方定义的类名,但通常提到此类名称时,开发者可能是指实现类似 **FlowLayout**(流式布局)效果的自定义 `LayoutManager`。`FlowLayout` 是一种常见的布局方式,其特点是子视图按照从左到右的顺序排列,当一行空间不足时自动换行[^1]。 ### 实现 FlowLayout 的方式 要实现类似 `FlowLayout` 的布局效果,可以通过以下两种方式: #### 1. 使用现成的开源库 目前已有多个开源项目实现了 `FlowLayout` 的功能,例如: - **FlowLayout★2233**:一个成熟的流式布局实现,支持子视图自动换行、动态添加视图等功能[^1]。 - **FlowTag★549**:适用于标签类场景的流式布局库,支持点击、选择等交互行为[^1]。 - **FlowLayoutDemo★19**:提供了一个简单的流式布局示例,适合学习和快速集成。 这些库通常基于 `ViewGroup` 或 `RecyclerView` 实现,开发者可以直接通过 Gradle 引入并使用。 #### 2. 自定义 `LayoutManager` 实现 如果希望更深入理解其实现机制,可以继承 `RecyclerView.LayoutManager` 并重写其关键方法,主要包括: - `onLayoutChildren()`:负责测量和布局子视图。 - `canScrollVertically()` 或 `canScrollHorizontally()`:控制是否支持滚动。 - `scrollVerticallyBy()` 或 `scrollHorizontallyBy()`:实现滚动逻辑。 以下是一个简化版的 `FlowLayout` 实现思路: ```java public class FlowLayoutManager extends RecyclerView.LayoutManager { @Override public RecyclerView.LayoutParams generateDefaultLayoutParams() { return new RecyclerView.LayoutParams( RecyclerView.LayoutParams.WRAP_CONTENT, RecyclerView.LayoutParams.WRAP_CONTENT); } @Override public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { if (getItemCount() == 0 || state.isPreLayout()) { return; } detachAndScrapAttachedViews(recycler); int left = getPaddingLeft(); int top = getPaddingTop(); int rowMaxHeight = 0; for (int i = 0; i < getItemCount(); i++) { View view = recycler.getViewForPosition(i); addView(view); measureChildWithMargins(view, 0, 0); int width = getDecoratedMeasuredWidth(view); int height = getDecoratedMeasuredHeight(view); if (left + width > getWidth() - getPaddingRight()) { left = getPaddingLeft(); top += rowMaxHeight; rowMaxHeight = 0; } layoutDecorated(view, left, top, left + width, top + height); left += width; rowMaxHeight = Math.max(rowMaxHeight, height); } } } ``` 该代码片段展示了如何在 `onLayoutChildren()` 中逐个测量并布局子视图,当当前行空间不足时换行。 ### 使用 FlowLayoutManager 在实际使用中,只需将该 `LayoutManager` 设置给 `RecyclerView` 即可: ```java RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new FlowLayoutManager()); recyclerView.setAdapter(adapter); ``` ### 注意事项 - 实现 `FlowLayout` 时需要处理子视图的测量与布局逻辑,尤其是换行判断和视图回收机制。 - 若需支持动画、嵌套滚动或点击交互,还需额外实现 `ItemDecoration`、`ItemAnimator` 等组件。 - 可参考开源项目 **FlowLayoutManager★1018** 获取更完整的实现案例[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值