Java的王牌是它的AWT,这是面向对象的图形用户接口(GUI)框架。但是Java的
AWT只包括较简单的构件,它不包括位图菜单和位图按
钮的标准控件。如何在自己的Java应用程序中加上图像按钮呢?笔者经过摸索,发
现了以下两种方法。
1.预备图标资源
在Java应用程序中,AWT提供的按钮标准控件(Button类)只能显示字符串。若
要显示图像按钮,只有把每一个图像按钮都设计成对应一个或一组图形。因此,在
做一个按钮之前,要预备好一系列的图像文件。这些文件最好是JPEG或GIF格式的
。假如是其他格式,则需转换,否则,得自己编制一个专门类加在自己的Java应用程
序中。这些图像资源可以直接从其他应用程序中拷贝过来,也可以使用一些图形编
辑软件(如Adobe Photoshop,Picture Publisher等)来编辑。
2.绘制图像按钮
在获取图像之后,我们现在就可以考虑编制程序的问题了。在Java中装载、显
示图像有两种方法。一种是使用Applet类中的getImage(String)函数,载入方法如
下所示:
Image myImg=getImage(URL,"ImageName");
另一种是使用ToolKit类中的getImage(String)函数。载入方法如下所示:
Image myImg =ToolKit.getDefaultToolKit().getImage(URL,"ImageNa
me");
在完成装载图像工作后,即可用两种方法设计图像按钮。
(1)方法一
把按钮的按下和释放两个动作设计成随着鼠标动作变化的轮换显示的两个图
像,Img1,Img2。首先,我们设计一个ImageButton构件类,它继续Canvas类,把上述
两个图像放在这个ImageButton类之中。其次,再设计一个setImage(String)函数
,也把它加入ImageButton类中。它的功能是能够设置ImageButton构件当前显示的
图像。当判定出是按钮按下时,就改变当前按钮图像为按钮按下时的图像。这样,
一个ImageButton类就对应一个图像按钮的所有图像信息和基本操作。最后,可以
在一个Panel构件中,加入许多这样的ImageButton构件,再把Panel构件按照布局管
理器的规定放在Frame类或其他容器中。具体设计如下:
import java.awt.*;
……
class ImageButton extends Canvas{ //定义一个图像按钮类
Image image;
//按钮上的图像
Dimension preferredSize;
//按钮的尺寸大小
ImageButton(Image img,int x,int y){
image=img;
preferredSize=new Dimension();
preferredSize.width=x;
preferredSize.height=y;
}
public void paint(Graphics g){ //绘制图像按钮
g.drawRect(0,0,preferredSize.width,preferredSize.hei
ght);
g.drawImage(image,0,0,this);
}
public void setImage(Image img){ //设置新图像
image=img;
repaint();
}
……
}//****** End of ImageButton ******
……
(2)方法二
直接设计一个ImageButton 构件类,它继续Canvas类,在其内部通过对按钮的
按下或释放的判定来改变按钮轮廓的明暗边界。当判定出按钮按下时,就改变按钮
边框的明暗布局。这样,就动态地实现了一个按钮按下和释放的过程。然后我们可
以把图像裱贴在按钮的中心位置,这就实现了图像按钮的功能。其中,设计一个se
tPush(booleanPush)函数,也把它加入ImageButton类中。它的功能是设置图像按
钮构件当前按下或释放状态。最后,可以在一个Panel构件中,加入许多这样的Ima
geButton构件。具体设计如下:
class ButtonCanvas extends Canvas{
boolean tPush;
Dimension ps;
Image img;
ButtonCanvas(Image image,int x,int y){
img=image;
ps=new Dimension();
ps.width=x;
ps.height=y;
}
public void setPush(boolean tt){
tPush=tt;
repaint();
}
public void paint(Graphics g){
//绘制按钮边界和背景
g.drawRect(0,0,ps.width-1,ps.height-1);
setBackground(Color.gray);
g.setColor(Color.gray.brighter());
g.fillRect(2,2,ps.width-3,ps.height-3);
//*** 在画布上绘制按钮 按下或释放 ***
if(!tPush){
g.setColor(Color.gray.darker());
g.drawLine(ps.width-2,1,ps.width-2,ps.height-2);
g.drawLine(1,ps.height-2,ps.width-2,ps.height-2);
g.setColor(Color.white);
g.drawLine(1,1,ps.width-2,1);
g.drawLine(1,1,1,ps.height-2);
}
else{
g.setColor(Color.white);
g.drawLine(ps.width-2,1,ps.width-2,ps.height-2);
g.drawLine(1,ps.height-2,ps.width-2,ps.height-2);
g.setColor(Color.gray.darker());
g.drawLine(1,1,ps.width-2,1);
g.drawLine(1,1,1,ps.height-2);
}
//**** 在按钮中心加载图像 ******
g.drawImage(img,
ps.width/2-img.getWidth(this)/2,
ps.height/2-img.getHeight(this)/2,this);
}// end of paint()
}// end of ButtonCanvas
3.编制响应程序
事件处理是GUI编程的核心。对于Applet 小程序,它的事件捕捉和处理比应用
程序简单。可把捕捉程序放在其GUI构件的子类之中,也可以把捕捉程序放在构件
的容器之中。笔者采用后一方法。
……
public class MyTest extends Frame
……//事件响应函数
public boolean handleEvent(Event evt)
{
switch (evt.id)
{
……
case Event.MOUSE_DOWN:
if(evt.target instanceof Canvas){
if(evt.target==ImageClossButton){
ImageClossButton.setPush(true);
mTextArea.setText("按下");
}
return true;
case Event.MOUSE_UP:
if(evt.target instanceof Canvas){
if(evt.target==ImageClossButton){
ButCvs.setPush(false);
mTextArea.setText("释放");
}
return true;
default:
return super.handleEvent(evt);
}
} // End of handleEvent
} // End of Frame