选择显示字体大小

jfc/swing活学活用之创建自定义图像组件

下载本文源代码

  引言

  本文将讲述如何应用jfc/swing内建的图像组件来创建完全自定义的基于图像的用户接口。

  大多数swing应用程序是通过标准vm提供的,或者是客户提供的外观和感觉(l&f)来获取它们的外在展示。l&f是一个完整的体系架构,vm需要做很多内在的工作,并且它还不是完全自定义的。举个例子来说吧,在基于l&f的前提下,我们可以创建一个按钮,看起来有点像交通岗上的"红灯",随之而来的在你的应用中所有的按钮就都有了这样的"相貌"。然而有时我们所真正需要的就是一个看起来与图像完全一样的按钮,就像web上面基于图像的按钮一样。

  为了让大家更好的了解我们所要介绍的内容,先来看一下最终的显示效果,如下图所示:一个带面板(panel)的窗格(frame)包含了一个标签(label),一个按钮(button),一个复选框(checkbox)。面板、标签和按钮完全由图像绘制,完全没有使用到标准的l&f。复选框是一个标准的checkbox,但它将被设计成是透明的以搭配图像背景。



  第一步 创建背景panel

  要完成这"天堂"般的工程,首先我们要做的是创建一个图像背景。因为这样的组件可重用性(reusable)很高,所以我们创建了jpanel类的一个子类,叫做imagepanel,参考下面的代码示例:

  示例代码1:

package com.demo.jcomponents;

import java.awt.*;
import javax.swing.*;

/**
* 创建图像面板
* @author xiazhi
*/
public class imagepanel extends jpanel
{
 /**
 * 图形对象
 */
 private image img;

 /**
 * 构造函数
 *
 * @param img 图像对象
 */
 public imagepanel(string img)
 {
  this(new imageicon(img).getimage());
 }

 /**
 * 构造函数
 *
 * @param img 图像对象
 */
 public imagepanel(image img)
 {
  this.img = img;

  // 定义图像尺寸
  dimension size = new dimension(img.getwidth(null), img.getheight(null));
  setpreferredsize(size);
  setminimumsize(size);
  setmaximumsize(size);
  setsize(size);

  // 定义布局方式为空
  setlayout(null);
 }

 /**
 * 重画画布
 */
 public void paintcomponent(graphics g)
 {
  g.drawimage(img, 0, 0, null);
 }
}

  构造函数使用image的实例作为参数,并将绘制的图像保存在变量img中以备以后使用。接着调用setsize()和setpreferredsize()方法,并以图像的尺寸作为参数。这样可以确保panel的尺寸与图像的尺寸完全一致。接下来的操作非常重要,必须显示地指定panel的preferred、maximum和minimum尺寸,因为panel类的父类和子类可能不会使用绝对布局方式。

  小提示:我们都知道,swing是使用布局管理器(layout manager)来控制组件的位置,绝对布局的意思就是不使用布局管理器来控制组件的位置。(可以通过setlayout(null)方法来指定采用绝对布局方式)

  既然这样,显示指定的尺寸和位置将会被使用(可以通过setsize()和setlocation()方法)。当使用指定的布局管理器时,preferred,minimum和maximum尺寸可能会被使用。为了适应上面所有的情况,我们只要简单的设置上面所提及的四个方法就可以了。

  现在,panel已经设置了适当的尺寸,我们可以通过重载paintcomponent()方法来绘制图像:

public void paintcomponent(graphics g)
{
 g.drawimage(img, 0, 0, null);
}

  小提示:在这里我们重载了paintcomponent()方法,而不是paint()方法,这是很重要的一点,要不然子类将不会被重新绘制。

  现在来测试一下我们工作的成果,我们将自定义的panel添加到一个frame中,然后显示该frame,参考下面的代码示例:

  示例代码2:

package com.demo.jcomponents;

import javax.swing.*;

/**
* 测试图像panel组件
* @author xiazhi
*/
public class imagetest1
{
 public static void main(string[] args)
 {

  imagepanel panel = new imagepanel(createimageicon("images/background.png").getimage());

  jframe frame = new jframe("jfc/swing:创建以图像为主题的组件");
  frame.getcontentpane().add(panel);

  frame.pack();
  frame.setvisible(true);
 }

 protected static imageicon createimageicon(string path)
 {
  java.net.url imgurl = imagetest1.class.getresource(path);
  if (imgurl != null)
  {
   return new imageicon(imgurl);
  }
  else
  {
   system.err.println("不能找到指定文件: " + path);
   return null;
  }
 }
}

  程序运行后,显示效果如下:


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范