欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Swing基础教程 06:定制布局方法

最编程 2024-02-11 11:06:17
...
package my;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

public class MyFrame extends JFrame
{

	public MyFrame(String title)
	{
		super(title);
		
		// 不使用布局器  (默认地,ContentPane自带一个BorderLayout布局器)
		Container root = this.getContentPane(); 
		root.setLayout(null); // 取消其布局器
		
		// 由于没有布局器,所以默认地,子控件无法显示
		JLabel a1 = new ColorfulLabel("1", Color.yellow);
		JLabel a2 = new ColorfulLabel("2", Color.blue);
		root.add(a1);
		root.add(a2);
		
		a1.setBounds(new Rectangle(0,0, 200,200));
		a2.setBounds(new Rectangle(100,100, 200,100));
	}
	
	
	// ColorfulLabel: 参考4.5节的讲解
	private static class ColorfulLabel extends JLabel
	{
		public ColorfulLabel(String text, Color bgColor)
		{
			super(text);
			setOpaque(true);
			setBackground(bgColor);
			setPreferredSize(new Dimension(60,30));
			setHorizontalAlignment(SwingConstants.CENTER);
			setFont(new Font("微软雅黑", Font.PLAIN, 20) );
		}
	}
}

创建布局器

package my;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.LayoutManager;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

public class MyFrame extends JFrame
{
	JLabel a1 = new ColorfulLabel("Hello,World", Color.yellow);
	JLabel a2 = new ColorfulLabel("样例文本", new Color(202,255,112));
	
	public MyFrame(String title)
	{
		super(title);
		
		// 根容器
		Container root = this.getContentPane();
		
		// 设置一个自定义的布局器
		LayoutManager layoutMgr = new SimpleLayout();
		root.setLayout(layoutMgr);
		
		// 由于没有布局器,所以默认地,子控件无法显示
		root.add(a1);
		root.add(a2);
	}
	
	
	// ColorfulLabel: 参考4.5节的讲解
	private static class ColorfulLabel extends JLabel
	{
		public ColorfulLabel(String text, Color bgColor)
		{
			super(text);
			
			setOpaque(true);
			setBackground(bgColor);
			//setPreferredSize(new Dimension(60,30));
			setHorizontalAlignment(SwingConstants.CENTER);
			setFont(new Font("宋体", Font.PLAIN, 16));
		}
	}
	
	private class SimpleLayout implements LayoutManager
	{

		@Override
		public void addLayoutComponent(String name, Component comp)
		{
		}

		@Override
		public void removeLayoutComponent(Component comp)
		{
		}

		@Override
		public Dimension preferredLayoutSize(Container parent)
		{
			return null;
		}

		@Override
		public Dimension minimumLayoutSize(Container parent)
		{
			return null;
		}

		@Override
		public void layoutContainer(Container parent)
		{
			int w = parent.getWidth(); // 父窗口的宽度 width
			int h = parent.getHeight(); // 父窗口的高度 height
			System.out.println("父容器: " + w + ", " + h);
			
			// a1 显示在中间, 以 Preferred Size 作为大小
			if(a1.isVisible())
			{
				// 得取该控件所需的显示尺寸
				Dimension size = a1.getPreferredSize();
				//System.out.println(size);				
				int x = (w - size.width) / 2;
				int y = (h - size.height) /2 ;
				
				// 在设置子控件位置时,其坐标是相对于父窗口的 
				// (0,0) 就是父窗口的左上角
				a1.setBounds(x, y, size.width, size.height);
			}

			// a2 显示在右上角
			if(a2.isVisible())
			{
				Dimension size = a2.getPreferredSize();
				//System.out.println(size);
				int x = (w - size.width);
				int y = 0;
				a2.setBounds(x, y, size.width, size.height);
			}
		}		
	}
}

手动布局

package my;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.LayoutManager;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

import af.swing.layout.AfSimpleLayout;

public class MyFrame extends JFrame
{
	JLabel a1 = new ColorfulLabel("Hello,World", Color.yellow);
	JLabel a2 = new ColorfulLabel("样例文本", new Color(202,255,112));
	
	public MyFrame(String title)
	{
		super(title);
		
		// 根容器
		Container root = this.getContentPane();
		
		// 设置一个自定义的布局器
		LayoutManager layoutMgr = new MyCustomLayout();
		root.setLayout(layoutMgr);
		
		// 由于没有布局器,所以默认地,子控件无法显示
		root.add(a1);
		root.add(a2);
	}
	
	
	// ColorfulLabel: 参考4.5节的讲解
	private static class ColorfulLabel extends JLabel
	{
		public ColorfulLabel(String text, Color bgColor)
		{
			super(text);
			
			setOpaque(true);
			setBackground(bgColor);
			//setPreferredSize(new Dimension(60,30));
			setHorizontalAlignment(SwingConstants.CENTER);
			setFont(new Font("宋体", Font.PLAIN, 16));
		}
	}
	
	private class MyCustomLayout extends AfSimpleLayout
	{

		@Override
		public void layoutContainer(Container parent)
		{
			int w = parent.getWidth(); // 父窗口的宽度 width
			int h = parent.getHeight(); // 父窗口的高度 height
			System.out.println("父容器: " + w + ", " + h);
			
			// a1 显示在中间, 以 Preferred Size 作为大小
			if(a1.isVisible())
			{
				// 得取该控件所需的显示尺寸
				Dimension size = a1.getPreferredSize();
				//System.out.println(size);				
				int x = (w - size.width) / 2;
				int y = (h - size.height) /2 ;
				
				// 在设置子控件位置时,其坐标是相对于父窗口的 
				// (0,0) 就是父窗口的左上角
				a1.setBounds(x, y, size.width, size.height);
			}

			// a2 显示在右上角
			if(a2.isVisible())
			{
				Dimension size = a2.getPreferredSize();
				//System.out.println(size);
				int x = (w - size.width);
				int y = 0;
				a2.setBounds(x, y, size.width, size.height);
			}					
		}	
	}	
}



package af.swing.layout;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager;

public abstract class AfSimpleLayout implements LayoutManager
{
	@Override
	public void addLayoutComponent(String name, Component comp)
	{
	}

	@Override
	public void removeLayoutComponent(Component comp)
	{
	}

	@Override
	public Dimension preferredLayoutSize(Container parent)
	{
		return null;
	}

	@Override
	public Dimension minimumLayoutSize(Container parent)
	{
		return null;
	}

//	@Override
//	public void layoutContainer(Container parent)
//	{		
//	}
}

线性布局

package my;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.LayoutManager;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

import af.swing.layout.AfXLayout;

public class MyFrame extends JFrame
{
	JLabel a1 = new ColorfulLabel("Hello,World", Color.yellow);
	JLabel a2 = new ColorfulLabel("样例文本", Color.blue);
	JLabel a3 = new ColorfulLabel("Good Boy", Color.CYAN);
	JLabel a4 = new ColorfulLabel("占满剩余", Color.red);
	
	public MyFrame(String title)
	{
		super(title);
		
		// 根容器
		JPanel root = new JPanel();
		this.setContentPane(root);
		
		// 设置为横向布局 
		// 注: AfXLayout 与 AfRowLayout等效
		root.setLayout(new AfXLayout(8)); // 子控件之间的间距为8像素
		
		root.add(a1, "100px"); // 固定占100像素
		root.add(a2, "30%");  // 固定占30%
		root.add(a3, "auto"); // 按 Preferred Size 设置
		root.add(a4, "1w");   // 按权重设置,权重为1 weight
	}
	
	
	// ColorfulLabel: 参考4.5节的讲解
	private static class ColorfulLabel extends JLabel
	{
		public ColorfulLabel(String text, Color bgColor)
		{
			super(text);
			
			setOpaque(true);
			setBackground(bgColor);
			//setPreferredSize(new Dimension(60,30));
			setHorizontalAlignment(SwingConstants.CENTER);
			setFont(new Font("宋体", Font.PLAIN, 16));
		}
	}
}



package af.swing.layout;

/* 横向布局器,和 AfRowLayout 等效 
 * 
 */
public class AfXLayout extends AfRowLayout
{
	public AfXLayout()
	{		
	}
	public AfXLayout(int gap)
	{		
		super(gap);
	}
	public AfXLayout(int gap, boolean usePerferredSize)
	{	
		super(gap, usePerferredSize);
	}
}

*位置布局

package my;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

import af.swing.layout.AfAnyWhere;
import af.swing.layout.AfMargin;

public class MyFrame extends JFrame
{
	JLabel a1 = new ColorfulLabel("Hello,World", Color.yellow);
	JLabel a2 = new ColorfulLabel("样例文本", Color.blue);
	JLabel a3 = new ColorfulLabel("Good Boy", Color.CYAN);
	JLabel a4 = new ColorfulLabel("占满剩余", Color.red);
	
	public MyFrame(String title)
	{
		super(title);
		
		// 根容器
		JPanel root = new JPanel();
		this.setContentPane(root);
		
		// 设置为自动位置布局
		root.setLayout(new AfAnyWhere()); 
		
		// 左上 ,相当于 new AfMargin(0,0,-1,-1)
		root.add(a1, AfMargin.TOP_LEFT); 
		
		// 右上 ,相当于 new AfMargin(0,-1,-1,0)
		root.add(a2, AfMargin.TOP_RIGHT);  
		
		// 中间 ,相当于 new AfMargin(-1, -1, -1, -1)
		root.add(a3, AfMargin.CENTER); // 中间
		a3.setPreferredSize(new Dimension(160,80));
		
		// *位置定义
		root.add(a4, new AfMargin(
						

上一篇: 轻松掌握Java Swing组件setBounds的基本用法实例详解

下一篇: 深入解析IDEA Swing可视化工具JFormDesigner