本文资料来源:《java疯狂讲义》 作者:李刚


终于要学习这一部分了~~虽然很多人(明明是绝大多数的人)说学这个没有用...而且有点过时了...但我觉得很有意思啊...感兴趣就学~~反正多学东西又不会吃亏~~

为啥有趣呢~因为学会了这个,就能做出一些拥有哦图形用户界面的程序,然后放到桌面上用啦~~

开始正经的学习了~~


 一:初识AWT

在java.awt包中有两个基类来表示图形界面元素:
  Component表示一个能以图形化方式显示出来,并与用户交互的对象
  MenuComponent表示图形界面的菜单组件
 
在Component类中常用的设置组件大小位置和可见性的方法
  setLocation(int x,int y) ;设置组件的大小
  setSize(int width,int height);设置组件的大小
  setBounds(int x,int y,int width,int height);同时设置组件的位置和大小
  setVisible(Boolean b);设置组件的可见性
 
容器具有盛装其他组件的功能,常用的访问容器组件的方法:
  Component add(Component comp); 向容器中添加其他组件,并返回被添加的组件
  Component getComponentAt(int x,int y);返回指定点的组件
  int getComponentCount();返回容器内组件的数量
  Component[] getComponents(); 返回容器内所有的组件
 

AWT中的三种容器类型(window/Panel/ScrollPane)

1:window:可以独立存在的顶级窗口

Frame是window的一个子类,是一种常见的窗口,是window的子类,有标题,可以通过拖拉来改变窗口位置,大小,初始化时为不可见,可以使用setVisible(true)使其显现出来,默认使用BorderLayout作为布局管理器

代码示例:

 import java.awt.Frame;

 /**
* 创建一个窗口
* */
public class TestFrame { public static void main(String[] args) { Frame f = new Frame("测试窗口");
//设置窗口的大小
f.setBounds(60,30,300,280);
//将窗口显示出来(Frame对象默认处于隐藏状态)
f.setVisible(true);
}
}

结果:运行后,出现了一个窗口

很神奇有没有...是不是就像第一次写出hello,word一样那么兴奋~~
 

2:Panel不能独立存在,外在表现是一个矩形区域,可以盛装其他组件,默认使用FlowLayout作为布局管理器

代码示例:
import java.awt.Button;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextField; /**
* 创建一个panel容器
*
* */
public class TestPanel { public static void main(String[] args) { //先创建一个主窗口来承载容器
Frame f = new Frame("测试窗口");
//设置窗口大小,位置
f.setBounds(80, 80, 300, 300);
//再创建一个panel容器
Panel p = new Panel();
//向容器中添加组件
p.add(new TextField(20));
p.add(new Button("点击有惊喜"));
//将容器添加到主窗口中
f.add(p);
//将主窗口设置成是显示的
f.setVisible(true);
}
}

结果:这次是直接用命令窗口编译的...为啥呢...因为eclips的环境可能没配置好...按钮的中文文字是乱码...

 

3:ScrollPane是一个带有滚动条的容器,如果组件过大,会自动产生滚动条,也可以通过指定特定的构造器参数来指定默认具有滚动条。默认使用BorderLayout作为布局管理器,并且通常不允许改变。

代码示例:
import java.awt.Button;
import java.awt.Frame;
import java.awt.ScrollPane;
import java.awt.TextField; public class TestScrollpana { public static void main(String[] args) { //创建一个主窗口并设置位置大小
Frame f = new Frame("测试窗口");
f.setBounds(80, 80, 300, 300);
//创建一个scrollpana 并指定总是有滚动条
//SCROLLBARS_ALWAYS/SCROLLBARS_AS_NEEDED/SCROLLBARS_NEVER
//以上三个分别表示(总是有/需要的时候/总是没有)
ScrollPane sp = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);
//添加组件
sp.add(new TextField(20));
sp.add(new Button("点我有惊喜"));
//放到主窗口中
f.add(sp);
//设置成可以看见的
f.setVisible(true);
}
}

结果:

怎么就只有一个按钮了呢?是因为使用了BorderLayout布局管理器,导致了容器中只有一个组件被显示出来了...

那布局管理器到底是啥呢?


二:布局管理器

布局管理器到底是啥呢?

“为了使生成的图形用户界面具有良好的平台无关性,java语言中,提供了布局管理器这个工具来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式。”
“对于不同的组件而言,它们都有一个最佳大小(既没有冗余空间,也灭有内容被遮挡),这个最佳大小通常是平台相关的,程序在不同平台上运行时,相同内容的大小可能不一样,如果让程序手动控制每个组件的大小,位置,这将给编程带来巨大的困难,为了解决这个问题,java提供了LayoutManager来解决这个问题,它可以根据运行平台来调整组件的大小,程序员要做的就是为容器选择合适的布局管理器”------引用自《java疯狂讲义》

如何为容器指定布局管理器呢?

   所有的AWT容器都有默认的布局管理器,可以使用容器对象的 setLayoutManager(LayoutManager lm)方法来为容器对象指定布局管理器

AWT提供的布局管理器

  AWT提供了5个常用的布局管理器(FlowLayout/BorderLayout/GridLayout/GridBigLayout/CardLayout)Swing还提供了一个BoxLayout布局管理器

1:FlowLayout布局管理器

 FlowLayout布局管理器默认从左向右排列所有的组件,遇到边界就折回下一行开始
有三个构造函数:
  FlowLayout():默认对齐方式,默认垂直,水平间距创建
  FlowLayout(int align):使用指定对齐方式,默认垂直,水平间距创建
  FlowLayout(int align,int hgap,int vgap):使用指定对齐方式,指定垂直,水平间距创建
align使用的是FlowLayout类的静态常量(FlowLayout.LEFT, FlowLayout.CENTER, FlowLayout.RIGHT)
代码示例:
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame; /**
* 使用FlowLayout布局管理器
* */
public class TestFlowLayout { public static void main(String[] args) { //创建一个主窗口
Frame f = new Frame("测试窗口");
//使用FlowLayout布局管理器
f.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 5));
//添加按钮
for(int i = 0; i <= 10; i ++ ) {
f.add(new Button("按钮" + i));
}
//将窗口设置为最佳大小
f.pack();
//显示窗口
f.setVisible(true);
}
}
结果:

拖动窗口,改变窗口大小,可以看到,里面的按钮会跟着窗口的改变而改变位置... 

使用了pack()方法,这样就不用设置窗口的位置和大小,直接生成一个最佳大小的窗口

2:BorderLayout布局管理器

BorderLayout布局管理器将容器分为了五个区域 (EAST,SOUTH,WEST,NORTH,CENTER),普通组件可以被放置在这五个区域中的任意一个。

改变BorderLayout布局管理器的大小时,SOUTH,NORTH,CENTER水平调整,EAST,WEST,CENTER上下调整

注意:

  1:当向使用BorderLayOut布局管理器的容器中添加组件的时候,需要指定要添加到哪个区域里,如果没有指定添加到哪个区域中,则默认添加到中间

  2:如果向一个区域中添加多个组件,后放入的组件会覆盖前面的组件

代码示例:

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame; /**
* 使用Borderlayout布局管理器
* */
public class TestBorderlayout { public static void main(String[] args) { Frame f = new Frame("测试窗口");
//使用Borderlayout布局管理器
f.setLayout(new BorderLayout(30,5));
f.add(new Button("△"),BorderLayout.NORTH);
f.add(new Button("×"),BorderLayout.SOUTH);
f.add(new Button("○"),BorderLayout.EAST);
f.add(new Button("口"),BorderLayout.WEST);
f.add(new Button("摇杆"));
f.pack();
f.setVisible(true);
}
}

结果:哈哈,摇杆~~

3:GridLayout布局管理器

GridLayout布局管理器将容器分割成网格状,每个网格所占的区域大小相同,添加组件时,默认从左向右,从上向下依次添加到王各种,大小由组件所处的区域决定

构造函数:

  GridLayout(int rows,int cols) 采用指定行数,列数,默认横向间距,纵向间距,将容器分割成多个网格

  GridLayout(int rows,int cols,int hgap,int vgap)采用指定行数,列数,指定横向,纵向间距将容器分割成多个网格

代码示例

import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout; /**
* 使用GridLayout布局管理器
* */
public class TestGridLayout { public static void main(String[] args) { //创建主窗口
Frame f = new Frame("测试窗口");
//使用GridLayout布局管理器
f.setLayout(new GridLayout(3, 4, 5, 5));
//向主窗口添加按钮
String [] buttonname = {"7","8","9","-","4","5","6","+","1","2","3","."};
for(int i = 0;i < buttonname.length; i ++) {
f.add(new Button(buttonname[i]));
}
f.pack();
f.setVisible(true);
}
}

结果:如果数据不对,可能导致结果不是你想要的那样...

4:GridBagLayout布局管理器

GridBagLayout布局管理器也是网格型的,但是一个组件可以跨越一个或多个网格,并且设置各个网格的大小互不相同,增加了灵活性。

java提供了GridBagConstraints对象,与特定的GUI组件关联,用于控制该组件的大小以及跨越性。

GridBagConstraints所提供的方法:

  gridx,gridy:设置受该对象控制的GUI组件的左上角所在网格的横向索引,纵向索引(左上角索引为0,0)也可以设置成GridBagConstraints.RELATIVE,默认值,表示当前组件紧跟在上一组件之后

  gridwidth,gridheight:设置受该对象控制的GUI组就按横向,纵向跨越多少个网格,两个属性值默认为1,如果设置为GridBagConstraints.REMAINDER,表示该组件是横向纵向最后一个组件GridBagConstraints.RELATIVE表示是横向,纵向倒数第二个组件

  fill:设置组件如何占领空白区域

    GridBagConstraints.NONE:组件不扩大

    GridBagConstraints.HORIZONTAL:组件水平扩大以占领空白区域

    GridBagConstraints.VERTICAL:组件垂直扩大以占领空白区域

    GridBagConstraints.BOTH:组件水平,垂直同时扩大以占领空白区域

  anchor:设置受该对象控制的GUI组件在其显示区域中的定位方式

    GridBagConstraints.CENTER:中间

    GridBagConstraints.NORTH:上中

    GridBagConstraints.NORTHWEST:左上 

    GridBagConstraints.NORTHEAST:右上

    GridBagConstraints.SOUTH:下中

    GridBagConstraints.SOUTHWEST:左下

    GridBagConstraints.SOUTHEAST:右下

    GridBagConstraints.EAST:右中

    GridBagConstraints.WEST:左中

  weightx,weighty:设置受该对象控制的GUI组件占领的多余空间的水平,垂直增加比例,属性默认值为0,即该组件不占领多余的空间

(---未完---待续---)

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

最新文章

  1. whoami与who am i
  2. JSP读取My SQL数据乱码问题的解决
  3. TCL校园招聘——软件开发工程师(java) 只招5个。。。
  4. html5 canvas画图之图形随拖动而复制(有操作指示)
  5. POJ 1922 Ride to School(贪心+模拟)
  6. [ES6] 20. Polyfills
  7. Javascript 母羊生小羊问题,递归
  8. CSS Text文本格式
  9. SQL Server Service Borker 1
  10. CodeForces 606A Magic Spheres
  11. maven compile启动报错
  12. EasyUI集成Kindeditor使用
  13. Android6.0以上系统动态获取权限
  14. oc 语法基础
  15. 【转】MFC内嵌cef3浏览器内核
  16. 404.17 - 动态内容通过通配符 MIME 映射映射到静态文件处理程序
  17. Dockerfile命令大全
  18. google Kickstart Round G 2017 三道题题解
  19. 像网页开发一样调试ios程序
  20. LinQ实战学习笔记(一) LINQ to (Objects, XML, SQL) 入门初步

热门文章

  1. meta 标签的作用
  2. JsonOperate 帮助类
  3. cache与MMU与总线仲裁
  4. 快速排序算法 java 实现
  5. C语言 04 进制
  6. PhpStorm创建Drupal模块项目开发教程(1)
  7. Redmine开发帮助
  8. 怎么用AJAX来判断dedecms用户是否登录呢
  9. Linux中tcpdump的编译和使用
  10. spring mvc(注解)上传文件的简单例子