在进行界面设计的时候,只有掌握好AWT和Swing 的下列思路,就能编写出比较好的图形用户界面:
首先是界面中的组件如何放置,其次是如何让组件相应用户的操作,再次是掌握每种组件的显示效果和如何相应用户的操作。
抽象窗口工具包AWT是java提供的建立用户图形用户界面GUI(Graphics User Interface )的开发包,AWT可用于java的Applet 和Application 中。
java.awt 包中提供了GUI 设计所使用的类和接口,可与从9-1 看到其中主要的类之间的关系。
java.awt包中提供基本的GUI设计工具,主要包括组件(Component),容器(Container),和布局管理器(layoutManager) 三个概念,每个概念对应一个类。
java图形用户界面的最基本组成部分是组件(Component),组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如每一个按钮,一个标签。组件不能独立的显示出来,必须将组件放在一定的容器中才可以显示出来。
类java.awt.Component 是许多组件类的父类,一般编程过程中采用的都是Component类的子类。
Container 是一个类,实际上是Component 的子类,因此容器的本身也是一个组件,具有组件的所有性质,但是它的主要功能是用于放置其他组件和容器。在实际编程过程中采用的都是容器类Container的子类。
布局管理器是来管理组件放置位置在容器中的位置和大小的。每一个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用对应的布局管理器。
为了使生成的图形用户界面具有良好的平台无关性,java语言中提供了布局管理器这个工具来管理组件中的布局,而不使用直接设置组件位置和大小的方式。LayoutManager 本身使一个接口,编程中通常使用的是实现了该接口的类。
常用容器
容器java.awt.Container 是 Component 的子类, 一个容器可以容纳多个组件,并使它们成为一个整体。
有三种类型的容器: Window Panel ScrollPane , 常用的容器有 Panel 、Frame、Applet,如下,创建一个窗口。
/*
* FirstFrame.java
*
* Created on 2020年11月14日, 上午10:09
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package mypkg;
import java.awt.*;
import java.awt.event.*;
public class FirstFrame extends Frame {
/** Creates a new instance of FirstFrame */
public FirstFrame(String str) {
super(str);
}
public static void main(String [] args){
FirstFrame fr = new FirstFrame("First contianer!");
fr.setSize(240,240); //设置窗口大小
fr.setBackground(Color.yellow); //设置窗口背景颜色
fr.setVisible(true); // 设置窗口为可见
fr.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
}
2,面板 Pannel
/*
* PanelInFrame.java
*
* Created on 2020年11月14日, 上午10:34
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package mypkg;
import java.awt.*;
import java.awt.event.*;
public class PanelInFrame extends Frame{
/** Creates a new instance of PanelInFrame */
public PanelInFrame(String str) {
super(str);
}
public static void main(String []args){
PanelInFrame pf = new PanelInFrame("Frame with panel");
Panel p = new Panel();
pf.setSize(200,200);
pf.setBackground(Color.yellow);
pf.setLayout(null);
p.setSize(100,100);
p.setBackground(Color.green);
pf.add(p);
pf.setVisible(true);
pf.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
}
3,布局管理器 :为了实现跨平台的特效并且获得动态的布局结果,java 将容器内的所有组件安排给一个“布局管理器”负责管理。如:排列顺序,组件的大小,位置,当窗口移动或调整大小后组件如何变化等功能授权给对应的容器布局管理器来管理,不同的布局管理器使用不同的算法和策略,容器可以通过选择不同的布局管理器来决定布局
布局管理器的相关类主要包括:FlowLayout,BorderLayout,GridLayout,CardLayout,GridBagLayout。
/*
* TowButtons.java
*
* Created on 2020年11月14日, 上午11:16
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package mypkg;
import java.awt.*;
import java.awt.event.*;
public class TowButtons {
private Frame f; //窗口
private Button b1; //按钮1
private Button b2; //按钮2
/** Creates a new instance of TowButtons */
public static void main(String [] args){
TowButtons tb = new TowButtons();
tb.go();
}
public void go(){
f = new Frame("FlowLayout");
f.setLayout(new FlowLayout());
b1 = new Button("Press Me");
b2 = new Button("Dont't Press me");
f.add(b1);
f.add(b2);
f.pack(); //紧凑排列,其作用相当于setSize(),即让窗口尽量小。
// 小到刚刚能够包容住b1 b2 两个按钮。
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
}
FlowLayout 是Panel 和Applet 的默认布局管理器。 组件在容器的放置规律是从上到下,从左到右进行放置,如果容器足够宽, 第一个组件先添加到容器的第一行的最左边。后续的组件依次添加到上一个组件的右边,如果当前行已放置不下该组件,则放置到下一行的最左边。
FlowLayout 的构造方法主要有下面几种:
FlowLayout(FlowLayout,RIGHT , 20,40);
第一个参数表示组件的对其方式,即在行中是居中,居左,居右还是居左对其,第二个参数是组件之间的横向间隔,第三个参数是组件之间的纵向间隔。单位是像素
FlowLayout(FlowLayout,LEFT);
居左对齐,横向间隔和纵向间隔都是默认值5个像素
FlowLayout();默认的对其方式是居中对齐,横向间隔和纵向间隔都是默认值5个像素。
/*
* TreeButtons.java
*
* Created on 2020年11月14日, 下午2:16
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package mypkg;
import java.awt.*;
import java.awt.event.*;
public class TreeButtons {
public static void main (String []args){
Frame f = new Frame();
f.setLayout(new FlowLayout());
Button button1 = new Button("OK");
Button button2 = new Button("Open");
Button button3 = new Button("Close");
f.add(button1);
f.add(button2);
f.add(button3);
f.setSize(300,100);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
}