下载本文源代码
引言
本文将讲述如何应用jfc/swing内建的图像组件来创建完全自定义的基于图像的用户接口。
大多数swing应用程序是通过标准vm提供的,或者是客户提供的外观和感觉(l&f)来获取它们的外在展示。l&f是一个完整的体系架构,vm需要做很多内在的工作,并且它还不是完全自定义的。举个例子来说吧,在基于l&f的前提下,我们可以创建一个按钮,看起来有点像交通岗上的"红灯",随之而来的在你的应用中所有的按钮就都有了这样的"相貌"。然而有时我们所真正需要的就是一个看起来与图像完全一样的按钮,就像web上面基于图像的按钮一样。
为了让大家更好的了解我们所要介绍的内容,先来看一下最终的显示效果,如下图所示:一个带面板(panel)的窗格(frame)包含了一个标签(label),一个按钮(button),一个复选框(checkbox)。面板、标签和按钮完全由图像绘制,完全没有使用到标准的l&f。复选框是一个标准的checkbox,但它将被设计成是透明的以搭配图像背景。
| 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); } } |
| public void paintcomponent(graphics g) { g.drawimage(img, 0, 0, null); } |
| 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; } } } |