java 布局管理器_JAVA布局管理器小结(七)无布局管理器的布局

话说武侠小说里面绝世高手需要再突破,一般都会自废之前的武功,也就是武功的最高境界也就成了无武功的境界,Java中预定义了很多种布局管理器,但是也给绝世高手一展雄风的场地,支持不使用任何的布局管理器。

无布局管理器的使用分别以下两个步骤:

1.SetLayout( null ); //通过这个语句设置无布局管理器;

2.使用reshape(

int, int, int, int )或者setBounds(

int, int, int, int )来设定组件放置的位置,以及组件的大小,其中reshape从JDK1.1起已经被抛弃。

代码示例:

import java.awt.*;

import java.applet.Applet;

public class test extends Applet{

private Button b1, b2, b3, b4, b5, b6;

public void init(){

b1 = new Button( "NO.1" );

b2 = new Button( "NO.2" );

b3 = new Button( "NO.3" );

b4 = new Button( "NO.4" );

b5 = new Button( "NO.5" );

b6 = new Button( "NO.6" );

//设置无布局管理器

setLayout( null );

//设置背景为粉红

setBackground( Color.pink );

//设置坐标基数

int base = 50;

//手动指定位置和大小

b3.setBounds( 0, 0, base, 3 * base );

b1.setBounds( base, 0, 3 * base, base );

b4.setBounds( 4 * base, 0, base, base );

b5.setBounds( base, base, 4 * base, base );

b2.setBounds( base, 2 * base, base, base );

b6.setBounds( 2 * base, 2 * base, 3 * base, base );

//向容器添加组件

add( b1 );

add( b2 );

add( b3 );

add( b4 );

add( b5 );

add( b6 );

}//end init

}

//end class

示例代码的运行效果:

a4c26d1e5885305701be709a3d33442f.png

如果看过之前我的总结的会发现这里实现的类似于用GridBagLayout布局管理器中实现的一个布局是类似的,但是这里有几个重要的地方要指出,首先,像上述代码这么写,必须要非常清楚显示的窗口大小以及组件的合适大小(效果截图中,我是调整了窗口大小,使得其美观才截图的,代码中并没有制定初始化时窗口的大小);其次是当窗口缩放的时候,上述给出的代码中,组件大小是恒定不变的。

细心的人可能会注意到,我在指定组件位置以及大小的时候,并不是直接使用数字(有些教材上是这么用的),而是用的一个比例关系和一个基数,其实一开始我也是直接指定的数字,运行的结果可想而知,组件非常小,无法看清组件上面的内容了,这里就明显的体现了一个显示兼容的问题,以及岁窗口不可变凸显的问题,如何解决这个问题,其实就是在使用的base上作文章。

a4c26d1e5885305701be709a3d33442f.png

以水平方向成比例扩展为例,如下图所示,将需要设计的UI界面等分成几个等份,每一个等份那么就是窗口宽度除以等份的个数,如图中横向分为了五个等份,那么可以将其中一个方框的宽度做为一个base,那么窗口宽度width与base之间的关系就是,base=width/k,如图中例子,这里就有base

= width / 5,那么显然,No.1按钮的宽度就为3

* base,这样,当窗口长度变化的话,按钮长度是等比例缩放的。

a4c26d1e5885305701be709a3d33442f.png

详细的示例代码如下:

import java.awt.*;

import java.applet.Applet;

public class test extends Applet{

private Button b1,

b2,

b3,

b4,

b5,

b6;

//用于记录窗口大小

private Dimension d1;

public void init(){

b1 = new Button( "NO.1" );

b2 = new Button( "NO.2" );

b3 = new Button( "NO.3" );

b4 = new Button( "NO.4" );

b5 = new Button( "NO.5" );

b6 = new Button( "NO.6" );

//设置无布局管理器

setLayout( null );

//设置背景为粉红

setBackground( Color.pink

);

//获取当前窗口大小

//设置坐标基数

d1 = getSize();

int base =

d1.width/5;

//手动指定位置和大小

b3.setBounds(

0, 0, base, 3 * base );

b1.setBounds(

base, 0, 3 * base, base );

nbsp;

int base = 50;

&

//b5.setBounds(

base, base, 4 * base, base );

b2.setBounds(

base, 2 * base, base, base );

b6.setBounds(

2 * base, 2 * base, 3 * base, base );

//向容器添加组件

add( b1 );

add( b2 );

add( b3 );

add( b4 );

add( b5 );

add( b6 );

}//end

init

//在实时更新的函数中添加对应窗口变化

//组件大小重新设置的部分

public void paint( Graphics g ){

//获取当前窗口大小

Dimension temp = getSize();

//窗口大小发生改变

//记录窗口大小

//重新设定组件大小

if(

!d1.equals(

temp ) ){

d1 = temp;

int base =

d1.width/5;

//重新指定位置和大小

b3.setBounds(

0, 0, base, 3 * base );

b1.setBounds(

base, 0, 3 * base, base );

b4.setBounds(

4 * base, 0, base, base );

b5.setBounds(

base, base, 4 * base, base );

b2.setBounds(

base, 2 * base, base, base );

b6.setBounds(

2 * base, 2 * base, 3 * base, base );

}

}

}

//end class

上述的代码实现的只是随窗口宽度变化而改变按钮大小,如果要实现随窗口高度变化改变按钮大小,那么需要新增一个基,其实这里就类似于坐标系中的x和y单位向量了,其做法与上述类似,只不过更为复杂,这里就不再赘述了,需要指出的是上述的代码由于指定大小需要int整型变量,而width/k可能获取的基数不是整型,那么这里会出现一定的偏差。

最后附上一张代码效果图:

a4c26d1e5885305701be709a3d33442f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值