仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 547|回复: 9
打印 上一主题 下一主题

[学习教程] JAVA教程之JFC/Swing活学活用之创立自界说图象组件...

[复制链接]
不帅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:14:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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我觉得最应该避免的就是:只学习,不思考,只记忆,不实践!
admin 该用户已被删除
沙发
发表于 2015-1-20 18:25:42 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
精灵巫婆 该用户已被删除
板凳
发表于 2015-1-26 10:38:17 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
爱飞 该用户已被删除
地板
发表于 2015-2-9 08:44:20 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
小女巫 该用户已被删除
5#
发表于 2015-2-27 04:59:37 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
若相依 该用户已被删除
6#
发表于 2015-3-4 01:47:28 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
金色的骷髅 该用户已被删除
7#
发表于 2015-3-4 11:23:21 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
第二个灵魂 该用户已被删除
8#
发表于 2015-3-6 13:21:43 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
飘飘悠悠 该用户已被删除
9#
发表于 2015-3-13 01:09:00 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
愤怒的大鸟 该用户已被删除
10#
发表于 2015-3-20 08:27:47 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 04:33

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表