常用AWT组件
AWT中的组件类层次关系图
Component类
Java的图形用户界面的最基本组成部分是组件,组件式一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,如一个按钮,一个标签等。抽象类Component是所有GUI组件的共同父类。Componet类规定了所有GUI组件的基本特征性。
Cavas
Canvas代表屏幕上的一块空白的矩形区域,程序能够在这个部件表面绘图,也能捕获用户操作,产生相应的事件。Canvas可以说是具有最基本的和最简单的GUI功能的部件。当我们设计一种自己定制具有GUI功能的部件类,这个类就可以继承Canvas,这样,这个部件就已经完成了GUI的基本功能,我们只需要在这个基础上增加子类部件所专有的外观和功能的相关代码就行了,我们想要绘制子类部件的外观,我们就必须覆盖Cavas的paint方法。
我们设计一个计时器部件,鼠标在部件上按下时,计时器开始计时,并在部件上显示计时时间,鼠标释放时,计时器停止计时。下面代码
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.text.SimpleDateFormat;
class StopWatch extends Canvas implements Runnable
{
private long startTime = 0;
private long endTime = 0;
private boolean bStart = false;
public StopWatch()
{
enableEvents(AWTEvent.MOUSE_EVENT_MASK);
setSize(80,30);
}
protected void processMouseEvent(MouseEvent e)
{
if(e.getID()==MouseEvent.MOUSE_PRESSED)
{
//鼠标按下时,启动计时线程,并让起始时间变量和终止时间变量都等于当前时间
bStart = true;
startTime = endTime = System.currentTimeMillis();
repaint();
new Thread(this).start();
}
else if(e.getID()==MouseEvent.MOUSE_RELEASED)
{
//鼠标释放时,终止计时线程,并重绘窗口表面上的内容
bStart = false;
repaint();
}
super.processMouseEvent(e);
}
public void paint(Graphics g)
{
//时间的小时、分、秒都用两位数字显示,不足两位前面加0
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Date elapsedTime = null;
try
{
elapsedTime = sdf.parse("00:00:00");
}
catch (Exception e)
{
}
elapsedTime.setTime(endTime-startTime+elapsedTime.getTime());
String display = sdf.format(elapsedTime);
g.drawRect(0,0,78,28);
g.fill3DRect(2,2,75,25,true);
g.setColor(Color.RED);
g.drawString(display,10,20);
}
public void run()
{
while(bStart)
{
try
{
Thread.sleep(500);
}
catch (Exception e)
{
e.printStackTrace();
}
endTime = System.currentTimeMillis();
repaint();
}
}
}
public class TestStopWatch
{
public static void main(String[] args)
{
Frame f = new Frame("StopWatch");
f.add(new StopWatch());
f.setSize(200,200);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
}
Checkbox
java提供的这个Checkbox类来建立单选按钮和多选按钮
对一般的程序来说,需要处理单选按钮和多选按钮的ItemEvent事件,从而获取用户选择的结果。处理ItemEvent事件的监听器接口为ItemListener,其中只有一个itemStateChanged方法,显然,ItemEvent是一种语义事件。 下面代码
import java.awt.*;
import java.awt.event.*;
public class TestCheckbox
{
Checkbox cb1 = new Checkbox("你喜欢我吗?",true);
CheckboxGroup cbg = new CheckboxGroup();
Checkbox cb2 = new Checkbox("喜欢",cbg,true);
Checkbox cb3 = new Checkbox("不喜欢",cbg,false);
public void init()
{
Frame f = new Frame("TestCheckBox");
FlowLayout fl = new FlowLayout();
f.setLayout(fl);
f.add(cb1);
f.add(cb2);
f.add(cb3);
cb1.addItemListener(new CbItemListener());
cb2.addItemListener(new CbItemListener());
cb3.addItemListener(new CbItemListener());
f.setBounds(0,0,300,100);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
class CbItemListener implements ItemListener
{
public void itemStateChanged(ItemEvent e)
{
Checkbox cb = (Checkbox)e.getItemSelectable();
if(cb.getLabel().equals("你喜欢我吗?"))
{
if(cb.getState()==true)
System.out.println("我很高兴");
else
System.out.println("我很伤心");
}
/*else if(cb.getLabel().equals("喜欢"))
{
if(e.getStateChange()==ItemEvent.SELECTED)
System.out.println("我也喜欢你");
else
System.out.println("我也不喜欢你");
}*/
else
{
Checkbox cbx = cbg.getSelectedCheckbox();
if(cbx!=null)
System.out.println(cbx.getLabel());
}
}
}
public static void main(String[] args)
{
new TestCheckbox().init();
}
}
Choice
Choice类用来制作用于单选的下拉列表。
import java.awt.*;
import java.awt.event.*;
public class TestChoice
{
Choice ch = new Choice();//创建Choice对象
TestChoice()
{
ch.add("choice1");
ch.add("choice2");
ch.add("choice3");
FlowLayout fl = new FlowLayout();
Frame f = new Frame("TestChoice");
f.setLayout(fl);
f.add(ch);
f.setBounds(0,0,200,100);
f.setVisible(tr