|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
诸如RMI,EJB等一些技术并不是你说的那么复杂,而是它们把一些复杂的工具封装成不复杂的工具了,理解这些工具是需要些时间。我问你,.net里有这些工具吗?要简单多少?。创立 弁言
本文将报告怎样使用JFC/Swing内建的图象组件来创立完整自界说的基于图象的用户接口。
年夜多半Swing使用程序是经由过程尺度VM供应的,大概是客户供应的表面和感到(L&F)来猎取它们的内在展现。L&F是一个完全的系统架构,VM必要做良多内涵的事情,而且它还不是完整自界说的。举个例子来讲吧,在基于L&F的条件下,我们能够创立一个按钮,看起来有点像交通岗上的"红灯",随之而来的在你的使用中一切的按钮就都有了如许的"容颜"。但是偶然我们所真正必要的就是一个看起来与图象完整一样的按钮,就像Web下面基于图象的按钮一样。
为了让人人更好的懂得我们所要先容的内容,先来看一下终极的显现效果,以下图所示:一个带面板(Panel)的窗格(Frame)包括了一个标签(Label),一个按钮(Button),一个复选框(Checkbox)。面板、标签和按钮完整由图象绘制,完整没有利用到尺度的L&F。复选框是一个尺度的Checkbox,但它将被计划成是通明的以搭配图象背景。
<P>
第一步创立背景Panel
要完成这"地狱"般的工程,起首我们要做的是创立一个图象背景。由于如许的组件可重用性(reusable)很高,以是我们创立了JPanel类的一个子类,叫做ImagePanel,参考上面的代码示例:
示例代码1:
packagecom.demo.jcomponents;
importjava.awt.*;
importjavax.swing.*;
/**
*创立图象面板
*@authorxiazhi
*/
publicclassImagePanelextendsJPanel
{
/**
*图形对象
*/
privateImageimg;
/**
*机关函数
*
*@paramimg图象对象
*/
publicImagePanel(Stringimg)
{
this(newImageIcon(img).getImage());
}
/**
*机关函数
*
*@paramimg图象对象
*/
publicImagePanel(Imageimg)
{
this.img=img;
//界说图象尺寸
Dimensionsize=newDimension(img.getWidth(null),img.getHeight(null));
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
setSize(size);
//界说结构体例为空
setLayout(null);
}
/**
*重画画布
*/
publicvoidpaintComponent(Graphicsg)
{
g.drawImage(img,0,0,null);
}
}
机关函数利用Image的实例作为参数,并将绘制的图象保留在变量img中以备今后利用。接着挪用setSize()和setPreferredSize()办法,并以图象的尺寸作为参数。如许能够确保Panel的尺寸与图象的尺寸完整分歧。接上去的操纵十分主要,必需显现地指定Panel的preferred、maximum和minimum尺寸,由于Panel类的父类和子类大概不会利用相对结构体例。
小提醒:我们都晓得,Swing是利用结构办理器(LayoutManager)来把持组件的地位,相对结构的意义就是不利用结构办理器来把持组件的地位。(能够经由过程setLayout(null)办法来指定接纳相对结构体例)
既然如许,显现指定的尺寸和地位将会被利用(能够经由过程setSize()和setLocation()办法)。当利用指定的结构办理器时,preferred,minimum和maximum尺寸大概会被利用。为了顺应下面一切的情形,我们只需复杂的设置下面所说起的四个办法就能够了。
如今,Panel已设置了得当的尺寸,我们能够经由过程重载paintComponent()办法来绘制图象:
publicvoidpaintComponent(Graphicsg)
{
g.drawImage(img,0,0,null);
}
小提醒:在这里我们重载了paintComponent()办法,而不是paint()办法,这是很主要的一点,要否则子类将不会被从头绘制。
如今来测试一下我们事情的功效,我们将自界说的Panel增加到一个Frame中,然后显现该Frame,参考上面的代码示例:
示例代码2:
packagecom.demo.jcomponents;
importjavax.swing.*;
/**
*测试图象Panel组件
*@authorxiazhi
*/
publicclassImageTest1
{
publicstaticvoidmain(String[]args)
{
ImagePanelpanel=newImagePanel(createImageIcon("images/background.png").getImage());
JFrameframe=newJFrame("JFC/Swing:创立以图象为主题的组件");
frame.getContentPane().add(panel);
frame.pack();
frame.setVisible(true);
}
protectedstaticImageIconcreateImageIcon(Stringpath)
{
java.net.URLimgURL=ImageTest1.class.getResource(path);
if(imgURL!=null)
{
returnnewImageIcon(imgURL);
}
else
{
System.err.println("不克不及找到指定文件:"+path);
returnnull;
}
}
}
程序运转后,显现效果以下:
<P> 第二步创立图象Label
如今背景的绘制事情已完成了。接上去要将重点转移到标签"ActivateReactor"的制造上了。这里仅仅是将一个静态的图象安排在背景的符合地位上。我们固然可使用别的一个ImagePanel实例来完成这部分功效,可是因为"ActivateReactor"这个几个笔墨实践上仅仅是一个标签,以是我们创立了别的一个子类ImageLabel,参考上面的代码示例:
示例代码3:
packagecom.demo.jcomponents;
importjavax.swing.*;
/**
*图象标签
*@authorxiazhi
*/
publicclassImageLabelextendsJLabel
{
/**
*机关函数
*
*@paramimg图象对象
*/
publicImageLabel(Stringimg)
{
this(newImageIcon(img));
}
/**
*机关函数
*
*@paramicon图象图标对象
*/
publicImageLabel(ImageIconicon)
{
//设置标签图标
setIcon(icon);
//设置标签图标和文本之间的距离
setIconTextGap(0);
//设置边框
setBorder(null);
//设置文本
setText(null);
setSize(icon.getImage().getWidth(null),icon.getImage().getHeight(null));
}
}
与ImagePanel相似,我们必要将Label的尺寸与图象的尺寸相婚配。这里我们只必要挪用setSize()办法便可,由于Label本人会处置别的的设置。接上去,将图标设置为我们指定的图象,如许Label本人会处置图象的绘制。经由过程设置文本距离为0,和设置边框为空,设置文本为空,将会往除图象的任何分外的空间,将会使Label与背景完善的啮合在一同。setOpaque(false)办法告知Label不要本人绘制背景。假如用图象添补Label,那末成绩不年夜,但假如图象中含有通明地区(年夜部分PNG范例的图象城市这个模样),那末在通明地区背景将会显现出来。
如今来测试一下我们的功效吧!在下面测试的基本上增加了一个Label,参考上面的代码示例:
示例代码4:
ImageLabellabel=newImageLabel(createImageIcon("images/reactor.png"));
//定位Label
label.setLocation(29,37);
//为Label增添提醒信息
label.setToolTipText("看到了吗?");
//将Label增加到Panel中
panel.add(label);
程序运转后,显现效果以下所示:
<P> 第三步创立图象Button
接上去是创立定制的Button。因为Button具有翻转特征和形态特征,以是绘制Button必要一些技能。我们再次创立了一个JButton类的子类,参考上面的代码示例:
示例代码5:
packagecom.demo.jcomponents;
importjava.awt.*;
importjavax.swing.*;
/**
*图象按钮
*@authorxiazhi
*/
publicclassImageButtonextendsJButton
{
/**
*机关函数
*
*@paramimg图象实例
*/
publicImageButton(Stringimg)
{
this(newImageIcon(img));
}
/**
*机关函数
*
*@paramicon图象图标
*/
publicImageButton(ImageIconicon)
{
//设置图标
setIcon(icon);
//设置空缺间距
setMargin(newInsets(0,0,0,0));
//设置文本与图标之间的距离
setIconTextGap(0);
//指定是不是绘制边框
setBorderPainted(false);
//设置边框
setBorder(null);
//设置文本
setText(null);
setSize(icon.getImage().getWidth(null),icon.getImage().getHeight(null));
}
}
这段代码几近与后面定制显现的JLabel的代码完整一样。独一的分歧的地方在于增添了setMargin()和setBorder()办法的挪用。年夜多半L&F利用边框(Border)和界限(Margin)来指明Button是不是已被拔取中。由于Label不克不及被拔取择,以是没有上述办法。不论怎样,我们只需将这两个属性封闭就能够了。
如今来测试一下我们的功效吧!在下面测试的基本上增加了一个Button,参考上面的代码示例:
示例代码6:
finalImageButtonbutton=newImageButton(createImageIcon("images/button.png"));
//定位Button
button.setLocation(60,74);
//将Button增加到Panel中
panel.add(button);
程序运转后,显现效果以下所示:
如今Button已增加到Panel中,剩下的只需将翻转和别的形态属性添到到Button中就能够了。侥幸的是,这些事情不必要我们在子类中增加任何新的代码。JButton已供应了经由过程图象来表征翻转、按下、选择、生效、生效选择等属性。我们只必要利用一般的set办法来增加各类形态变量,参考上面的代码示例:
button.setPressedIcon(createImageIcon("images/button-down.png"));
button.setRolloverIcon(createImageIcon("images/button-over.png"));
button.setSelectedIcon(createImageIcon("images/button-sel.png"));
button
.setRolloverSelectedIcon(createImageIcon("images/button-sel-over.png"));
button.setDisabledIcon(createImageIcon("images/button-disabled.png"));
button
.setDisabledSelectedIcon(createImageIcon("images/button-disabled-selected.png"));
增加上述代码后,再次运转程序,显现效果以下所示:
选择
未选择
在这里我们利用了带有光圈的图象来暗示Button被选中,将图象含混化来暗示Button被禁用,图象两头的矩形条用来暗示Button被选中的形态,除有色彩的改动外,另有发光的效果。
为了完全的演示一切的形态,我们在Button的下部增添了一个尺度的JCheckBox,一般情形下,它将会绘制一个灰色的背景(大概是带条纹的背景在Mac机上),我们挪用setOpaque(false)办法来强迫请求它不要绘制。当父类没有利用结构办理器时,挪用checkbox.setSize(checkbox.getPreferredSize())办法是必需的,如许可使checkbox取得符合的尺寸,就像本文示例中的情况:
示例代码7:
finalJCheckBoxcheckbox=newJCheckBox("Disable");
checkbox.setLocation(70,150);
//强迫请求checkbox不要绘制本人的背景
checkbox.setOpaque(false);
//设置checkbox的尺寸
checkbox.setSize(checkbox.getPreferredSize());
//增加到Panel中
panel.add(checkbox);
//增加事务监听器
checkbox.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEventevt)
{
button.setEnabled(!checkbox.isSelected());
}
});
到此示例程序已完全了,程序运转后,全体的显现效果以下所示:
停止语
至此,我们创立了完整定制的基于图象的组件,JFC/Swing有着复杂的布局,怎样更好的往了解,理清组件之间的奇妙干系,是学好Swing的关头。
而学习JAVA我觉得最应该避免的就是:只学习,不思考,只记忆,不实践! |
|