9常用的AWT组件
Component类 是所有javaGUI组件的共同父类。其规定了所有GUI组件的基本特性,该类中定义的方法实现了作为GUI组件所应具备的基本功能。Jav程序要显示的GUI组件必须是抽象类Component或MenuComponent的子类
Canvas是具有最基本和最简单的GUI功能的组件;
Canvas代表屏幕上的一块空白矩形区域,程序能够在这个部件上绘制图形,也能够捕获用户的操作,产生相应的事件。
当要设计自定制的具有GUI功能的组件类时,继承Canvas将会大大简化编程难度。
编程实例:设计一个自定制的计时器组件,当鼠标在计时器组件上按下时,计时器开始计时,并显示计时时间,当鼠标释放时,计时器停止计时。
程序清单:
package myprojects.TestStopWatch;
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,即"HH:mm:ss"这种的格式
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();
}
}
}
package myprojects.TestStopWatch;
import java.awt.*;
import java.awt.event.*;
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);
}
});
}
}
Date类考虑了本地时区问题,初始化elapsedTime.setTime(endTime – startTime)会是08:00:00,我们只是借助Date类生成这种格式,可以先求出显示时间为00:00:00的时间对象在内存中对应的那个整数,然后在这个整数基础上加计时器所记下的时间值,最后就能显示我们要的
Checkbox
Checkbox(String label, boolean state, CheckboxGroup group)用于创建单选按钮
对应单选和多选按钮的ItemEvent时间,处理该事件的监听器ItemListener只有一个itemStateChanged方法
构造具有指定标签的 Checkbox,并将它设置为指定状态,使它处于指定复选框组中
package myprojects.TestCheckbox;
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布局管理器;
FlowLayout f1 = new FlowLayout();
f.setLayout(f1);
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
{
Checkbox cbx = cbg.getSelectedCheckbox();
if(cbx!=null)
System.out.println(cbx.getLabel());
}
}
}
public static void main(String[] args)
{
new TestCheckbox().init();
}
}