话说武侠小说里面绝世高手需要再突破,一般都会自废之前的武功,也就是武功的最高境界也就成了无武功的境界,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
示例代码的运行效果:
如果看过之前我的总结的会发现这里实现的类似于用GridBagLayout布局管理器中实现的一个布局是类似的,但是这里有几个重要的地方要指出,首先,像上述代码这么写,必须要非常清楚显示的窗口大小以及组件的合适大小(效果截图中,我是调整了窗口大小,使得其美观才截图的,代码中并没有制定初始化时窗口的大小);其次是当窗口缩放的时候,上述给出的代码中,组件大小是恒定不变的。
细心的人可能会注意到,我在指定组件位置以及大小的时候,并不是直接使用数字(有些教材上是这么用的),而是用的一个比例关系和一个基数,其实一开始我也是直接指定的数字,运行的结果可想而知,组件非常小,无法看清组件上面的内容了,这里就明显的体现了一个显示兼容的问题,以及岁窗口不可变凸显的问题,如何解决这个问题,其实就是在使用的base上作文章。
以水平方向成比例扩展为例,如下图所示,将需要设计的UI界面等分成几个等份,每一个等份那么就是窗口宽度除以等份的个数,如图中横向分为了五个等份,那么可以将其中一个方框的宽度做为一个base,那么窗口宽度width与base之间的关系就是,base=width/k,如图中例子,这里就有base
= width / 5,那么显然,No.1按钮的宽度就为3
* base,这样,当窗口长度变化的话,按钮长度是等比例缩放的。
详细的示例代码如下:
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可能获取的基数不是整型,那么这里会出现一定的偏差。
最后附上一张代码效果图: