JavaAwtSwing布局笔记之 java.awt.BorderLayout

类定义

public class BorderLayout implements LayoutManager2,
                                     java.io.Serializable {

interface👇     interface👇
LayoutManager ▶ LayoutManager2 ▶ BorderLayout




概述

  • BorderLayout分为东西南北中五个区, 每个区只能添加一个java.awt.Component

  • 放在那个区可以由add(Component , Object)的第二个参数决定, 是一个String

    • 东区 BorderLayout.EAST 对应 “East”
    • 西区 BorderLayout.WEST 对应 “West”
    • 南区 BorderLayout.SOUTH 对应 “South”
    • 北区 BorderLayout.NORTH 对应 “North”
    • 中区 BorderLayout.CENTER 对应 “Center”
  • 可以设置行距 如 BorderLayoutInstance.setHgap(200);

  • 可以设置列距 如 BorderLayoutInstance.setVgap(100);

  • 子部件.setPreferredSize时, 东西width起作用,南北height起作用, center都不起作用

    • 子Component的setPreferredSize(Dimension preferredSize) 在 南北 时 height起作用
    • 子Component的setPreferredSize(Dimension preferredSize) 在 东西 时 width起作用
    • 子Component的setPreferredSize(Dimension preferredSize) 在 中部 时 不起作用
  • Frame默认自带BorderLayout

  • JFrame的contentPane默认自带BorderLayout

  • 拿布局,
    JFrame的布局不能直接用getLayout()拿, 要用.getContentPane().getLayout();
    Frame是用getLayout();直接拿

  • BorderLayout的Hgap和Vgap可用于居中_要在东西南北中都放组件时才起作用




默认样式

package layout;

import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

import javax.swing.*;

@SuppressWarnings({ "removal", "deprecation" })
public class BorderLayout东西南北中 {
	
	static Frame frame = new Frame(Thread.currentThread().getStackTrace()[1].getClassName());
	
	static JLabel East, West, South, North, Center;
	
	static {
		frame.addWindowListener(new WindowAdapter() {@Override public void windowClosing(WindowEvent event) {frame.dispose();System.exit(0);}});
		frame.setBounds(100, 50, 600, 480);
		
		try {
			Class<?> cl = new SecurityManager() {public Class<?> wantClass(){return getClassContext()[1];}}.wantClass();
			Field fields[] = cl.getDeclaredFields();
			for(int i=0;i<fields.length;i++) {
				Field field = fields[i];
				if(fields[i].getModifiers()==Modifier.STATIC && field.getType()==JLabel.class) {
					field.set(null, new JLabel(field.getName()));
					JLabel jlb = (JLabel)field.get(null);
					jlb.setBackground(new Color((int) (Math.random()*255*255*255))); jlb.setOpaque(true);
					jlb.setHorizontalAlignment(JLabel.CENTER); jlb.setVerticalAlignment(0);
//					jlb.setPreferredSize(new Dimension(200, 200));
					frame.add(jlb, jlb.getText());
				}
			}
			
		}catch(Exception ex) {ex.printStackTrace();}
		
	}
	
	public static  void main(String...arguments) {
		frame.setVisible(true);
	}

}

在这里插入图片描述




borderLayout.setHgap(200); borderLayout.setVgap(100);

package layout;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class BorderLayout2205271446 {
	
	static Frame frame = new Frame("BorderLayout2205271446");
	
	static BorderLayout borderLayout = (BorderLayout) frame.getLayout(); //Frame默认自带BorderLayout
	
	static JLabel jlb;

	static {
		frame.addWindowListener(new WindowAdapter() {@Override public void windowClosing(WindowEvent event) {frame.dispose();System.exit(0);}});
		frame.setBounds(new Rectangle(100, 50, 1600, 900));
		
		borderLayout.setHgap(200); borderLayout.setVgap(100);
		
		String titleAr[] = new String[] {"东" , "西" ,"南" ,"北" ,"中"};
		Color colorAr[] = new Color[] {Color.RED, Color.ORANGE, Color.yellow, Color.GREEN , Color.CYAN};
		String areaAr[] = new String[] {BorderLayout.EAST, BorderLayout.WEST, BorderLayout.SOUTH, BorderLayout.NORTH, BorderLayout.CENTER};
		Font font = new Font("宋体", Font.CENTER_BASELINE, 30);
		
		for(int i=0; i<areaAr.length; i++) {
			jlb = new JLabel(titleAr[i]); jlb.setBackground(colorAr[i]); jlb.setOpaque(true); jlb.setFont(font);
			jlb.setHorizontalAlignment(JLabel.CENTER); jlb.setVerticalAlignment(JLabel.CENTER);
			frame.add(jlb, areaAr[i]);
		}
	}
	public  static  void main(String...arguments) {frame.setVisible(true);}

}

在这里插入图片描述




东西南北中都 setPreferredSize(new Dimension(200, 200));

package layout;

import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

import javax.swing.*;

@SuppressWarnings({ "removal", "deprecation" })
public class BorderLayout东西南北中 {
	
	static Frame frame = new Frame(Thread.currentThread().getStackTrace()[1].getClassName());
	
	static JLabel East, West, South, North, Center;
	
	static {
		frame.addWindowListener(new WindowAdapter() {@Override public void windowClosing(WindowEvent event) {frame.dispose();System.exit(0);}});
		frame.setBounds(100, 50, 600, 480);
		
		try {
			Class<?> cl = new SecurityManager() {public Class<?> wantClass(){return getClassContext()[1];}}.wantClass();
			Field fields[] = cl.getDeclaredFields();
			for(int i=0;i<fields.length;i++) {
				Field field = fields[i];
				if(fields[i].getModifiers()==Modifier.STATIC && field.getType()==JLabel.class) {
					field.set(null, new JLabel(field.getName()));
					JLabel jlb = (JLabel)field.get(null);
					jlb.setBackground(new Color((int) (Math.random()*255*255*255))); jlb.setOpaque(true);
					jlb.setHorizontalAlignment(JLabel.CENTER); jlb.setVerticalAlignment(0);
					jlb.setPreferredSize(new Dimension(200, 200));
					frame.add(jlb, jlb.getText());
				}
			}
			
		}catch(Exception ex) {ex.printStackTrace();}
		
	}
	
	public static  void main(String...arguments) {
		frame.setVisible(true);
	}

}

在这里插入图片描述




同时设置 Vgap Hgap PreferredSize

package layout;

import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

import javax.swing.*;

@SuppressWarnings({ "removal", "deprecation" })
public class BorderLayout东西南北中 {
	
	static Frame frame = new Frame(Thread.currentThread().getStackTrace()[1].getClassName());
	
	static BorderLayout borderLayout = (BorderLayout) frame.getLayout(); //Frame默认自带BorderLayout
	
	static JLabel East, West, South, North, Center;
	
	static {
		frame.addWindowListener(new WindowAdapter() {@Override public void windowClosing(WindowEvent event) {frame.dispose();System.exit(0);}});
		frame.setBounds(100, 50, 600, 480);
		
		borderLayout.setHgap(20); borderLayout.setVgap(10);
		
		try {
			Class<?> cl = new SecurityManager() {public Class<?> wantClass(){return getClassContext()[1];}}.wantClass();
			Field fields[] = cl.getDeclaredFields();
			for(int i=0;i<fields.length;i++) {
				Field field = fields[i];
				if(fields[i].getModifiers()==Modifier.STATIC && field.getType()==JLabel.class) {
					field.set(null, new JLabel(field.getName()));
					JLabel jlb = (JLabel)field.get(null);
					jlb.setBackground(new Color((int) (Math.random()*255*255*255))); jlb.setOpaque(true);
					jlb.setHorizontalAlignment(JLabel.CENTER); jlb.setVerticalAlignment(0);
					jlb.setPreferredSize(new Dimension(200, 200));
					frame.add(jlb, jlb.getText());
				}
			}
			
		}catch(Exception ex) {ex.printStackTrace();}
		
	}
	
	public static  void main(String...arguments) {
		frame.setVisible(true);
	}

}

在这里插入图片描述




测试 Label JLabel Button JButton 在 BorderLayout中setPreferredSize()的效果

package component;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.*;

public class 测试SetPreferredSizeBorderLayout中有没有用2205222007 {
	static void pln() {System.out.println("");}
	static void pln(Object o) {System.out.println(o);}
	static void pln(Object o1, Object o2) {pln(o1+"  的结果是  "+o2);}
	
	
	static  Frame frame = new Frame("测试SetPreferredSize在BorderLayout中有没有用2205222007");
	static {
		frame.addWindowListener(new WindowAdapter() {
			@Override public void windowClosing(WindowEvent ev) {
				System.exit(0);
			}
		});
//		frame.setPreferredSize(new Dimension(1600,800));  //无用
		frame.setBounds(100,100,1600,800);
	}
	public  static  void main(String...arguments) throws Exception{
		
		Label label = new Label("Label  setPreferredSize(new Dimension(600, 0)", Label.CENTER); frame.add(label, BorderLayout.EAST);
		label.setBackground(Color.blue);
		label.setPreferredSize(new Dimension(600, 0));
//		label.setSize(800,200);  //无效
		
		JLabel jlb010 = new JLabel("JLabel  setPreferredSize(new Dimension(300,10))", JLabel.CENTER); frame.add(jlb010, BorderLayout.WEST);
		jlb010.setBackground(Color.YELLOW);
		jlb010.setPreferredSize(new Dimension(300,10));
		jlb010.setOpaque(true);
		
		Button button = new Button("Button  setPreferredSize(new Dimension(9999,200)"); frame.add(button, "North"); button.setPreferredSize(new Dimension(9999,200));
		
		JButton jButton = new JButton("JButton  setPreferredSize(new Dimension(9999,100)"); frame.add(jButton, "South"); jButton.setPreferredSize(new Dimension(9999,100));
		
		JButton jButton2 = new JButton("JButton  setPreferredSize(new Dimension(1,1)"); frame.add(jButton2, "Center"); jButton2.setPreferredSize(new Dimension(1,1));
		
		frame.setVisible(true);
		
		好酒在张工("java.awt.Label");
		好酒在张工("java.awt.Button");
		好酒在张工("javax.swing.JLabel");
		好酒在张工("javax.swing.JButton");
	}
	
	
	public static void 好酒在张工(String className) throws Exception{
		Frame frame = (Frame)Class.forName("java.awt.Frame").getDeclaredConstructor(String.class).newInstance("测试SetPreferredSize在BorderLayout中有没有用2205222007");
		frame.addWindowListener(new WindowAdapter() {
			@Override public void windowClosing(WindowEvent ev) {
				System.exit(0);
			}
		});
//		frame.setPreferredSize(new Dimension(1600,800));  //无用
		frame.setBounds(100,100,1600,800);
		
		String dxnbz[] = new String[] {"East" , "West" , "South" , "North" , "Center"};
		for(int i=0; i<dxnbz.length; i++) {
			Component component = (Component) Class.forName(className).getDeclaredConstructor(String.class).newInstance(dxnbz[i]);
			switch (dxnbz[i]) {
			case"East": component.setBackground(Color.RED); break;
			case"West": component.setBackground(Color.ORANGE); break;
			case"South": component.setBackground(Color.YELLOW); break;
			case"North": component.setBackground(Color.GREEN); break;
			case"Center": component.setBackground(Color.CYAN); break;
			}
			component.setPreferredSize(new Dimension(300,200));
			pln("查看默认的isOpaque() ,Component的false表示为轻量级组件, JComponent的true为不透明,看得到background,  component.getClass()="+component.getClass()+"    component.isOpaque()==", component.isOpaque());
			if(component.getClass()==JLabel.class) {
				JLabel jlb = (JLabel)component;
				jlb.setOpaque(true); // JLabel默认的opaque是false, 看不到background;
				pln("jlb.setOpaque(true);后, jlb.isOpaque()=", jlb.isOpaque());
			}
			frame.add(component, dxnbz[i]);
		}
		frame.setVisible(true);
	}

}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
都是东西width起作用,南北height起作用, center都不起作用



BorderLayout的Hgap和Vgap可用于居中_要在东西南北中都放组件时才起作用

package borderlayout;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.*;

public class BorderLayoutHgapVgap可用于居中_要在东西南北中都放组件时才起作用_JFrameJPanel演示 {
	
	
	public static void main(String...arguments)throws Exception{
		JFrame frame = new JFrame(Thread.currentThread().getStackTrace()[1].getClassName());
		frame.addWindowListener(new WindowAdapter() {
			@Override public void windowClosing(WindowEvent ev) {System.exit(0);}
		});
		
		JButton jbt = new JButton("""
				<html><head><style>
					body{font-size:14px; }
				</style></head><body>
					<h1>JButton</h1>
					<div>BorderLayout的Hgap和Vgap, 要在东西南北中都放组件时才起作用</div>
					<div>BorderLayout的Hgap和Vgap可以用来调整大小和居中CENTER中的组件</div>
					<div>东西南北默认有大小, 可用 setPreferredSize(new Dimension(0,0)) 将尺寸设为0</div>
				</body></html>
				""");
		
		frame.add(jbt); jbt.setDoubleBuffered(true);
		
		BorderLayout borderLayout = (BorderLayout) frame.getContentPane().getLayout();
		borderLayout.setVgap(300); borderLayout.setHgap(500); //>BorderLayout的Hgap和Vgap, 要在东西南北中都放组件时才起作用
		Component eastC = new JPanel(); //eastC.setPreferredSize(new Dimension(0, 450)); //南北宽度起作用
		eastC.setBackground(Color.blue); 
		frame.add(eastC, BorderLayout.EAST);
		frame.add(new JPanel(), BorderLayout.WEST);
		frame.add(new JPanel(), BorderLayout.SOUTH);
		frame.add(new JPanel(), BorderLayout.NORTH);
		
		frame.setBounds(100, 100, 1600, 900);
		frame.setVisible(true);
		
	}

}

![在这里插入图片描述](https://img-blog.csdnimg.cn/170a75ed76ba4d819b0e5f61ff8b1d67.png

JFrame的布局不能直接用getLayout()拿, 要 .getContentPane().getLayout();
Frame是直接拿 getLayout();

package borderlayout;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.*;

public class BorderLayoutHgapVgap可用于居中_要在东西南北中都放组件时才起作用_FramePanel演示 {
	
	
	public static void main(String...arguments)throws Exception{
		Frame frame = new Frame(Thread.currentThread().getStackTrace()[1].getClassName());
		frame.addWindowListener(new WindowAdapter() {
			@Override public void windowClosing(WindowEvent ev) {System.exit(0);}
		});
		
		JButton jbt = new JButton("""
				<html><head><style>
					body{font-size:14px; }
				</style></head><body>
					<h1>JButto</h1>
					<div>BorderLayout的Hgap和Vgap, 要在东西南北中都放组件时才起作用</div>
					<div>BorderLayout的Hgap和Vgap可以用来调整大小和居中CENTER中的组件</div>
					<div>东西南北默认有大小, 可用 setPreferredSize(new Dimension(0,0)) 将尺寸设为0</div>
				</body></html>
				""");
		
		frame.add(jbt); jbt.setDoubleBuffered(true);
		
		BorderLayout borderLayout = (BorderLayout) frame.getLayout();
		borderLayout.setVgap(300); borderLayout.setHgap(500); //>BorderLayout的Hgap和Vgap, 要在东西南北中都放组件时才起作用
		Component eastC = new Panel(); //eastC.setPreferredSize(new Dimension(0, 450)); //南北宽度起作用
		eastC.setBackground(Color.blue); 
		frame.add(eastC, BorderLayout.EAST);
		frame.add(new Panel(), BorderLayout.WEST);
		frame.add(new Panel(), BorderLayout.SOUTH);
		frame.add(new Panel(), BorderLayout.NORTH);
		
		frame.setBounds(100, 100, 1600, 900);
		frame.setVisible(true);
		
	}

}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kfepiza

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值