Swing杂记——Swing中引入Android的NinePatch技术,让Swing拥有Android的外观定制能力
【摘要】
本文诣在展示如何在Swing中引入 NinePatch技术(早期有文章里中文译作九格图,暂且这么叫吧^_^,但此术非传统移动手机上的功能布局——九格图哦)。
【准备篇】
Q:何为 NinePatch技术?
A:说简单点,就是用于对图片据屏幕大小进行自动拉伸的技术。更准确的介绍详见此文:http://www.yixieshi.com/ucd/9142.html。
NinePatch技术本身虽微不足道,但它对于 UI定制开发来说无疑是相当有价值的。也可直接看官方指南:http://developer.android.com/guide/developing/tools/draw9patch.html。
Q:NinePatch对Swing意味着什么?
A:利用NinePatch技术,比如:你在美化Swing的按钮UI时,再也不用根据不同的按钮大小准备不同的图片了,一张图片解决不同按钮按各自大小自动拉伸填充的问题,多么神奇!
当然,如果你对 程序比较熟,或者说对 程序外观定制比较熟的话,你将会更清楚这一点——Swing的外观定制能力将会因此变的无比灵活和强大,
很多不可能将成为现实。Android程序的外观定制其实有点Java标准平台换肤技术Synth的影子,但显然,这个聪名的小改进,使得 外观定制比Swing更容易、更灵活。
Q:从何处获得NinePatch技术呢?
A:NinePatch技术的核心只有3到4个类,拿过来用就可以了,源码地址可以在此链接找到:
http://www.java2s.com/Open-Source/Android/android-core/platform-sdk/com.android.ninepatch.htm,我打好的包稍
后可以在附件里下载哦。
【准备好.9.png图片】
本图片将使用NinePatch技术作为演示代码中的一JPanel背景进行自动填充之用,用不同的2张图是为了方便进行效果展示:

【测试代码】

package jb2011.t;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.io.InputStream;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import com.android.ninepatch.NinePatch;
/**
* 本类用于测试从Android中引入的NinePatch(九格图)技术的可行性.
*
* @author jb2011@163.com
* @version 1.0
*/
class Test extends JPanel
{
//NinePatch作为全局对象,提高性能
private NinePatch mPatch;
public Test()
{
super (new BorderLayout());
//*** 关键代码:读取9格图 START
try{
InputStream stream = this .getClass().getResourceAsStream(
// "content_bg2.9.png"
"content_bg3.9.png"
);
mPatch = NinePatch.load(stream, true /* is9Patch*/, false /* convert */);
}
catch (Exception e){
e.printStackTrace();
}
//*** 关键代码:读取9格图 END
//加入一个面板,用于演示
JPanel p = new JPanel();
p.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
//该面板设置成背景透明
p.setOpaque(false);
this.add(p);
//加入演示组件
p.add(new JButton("JButton 1"));
p.add(new JButton("JButton 2"));
p.add(new JButton("JButton 3"));
p.add(new JButton("JButton 4"));
}
/**
* 重写父类方法,以便实现自定义背景的绘制.
*/
@Override protected void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
Rectangle clip = g2.getClipBounds();
//*** 关键代码:使用9格图 START
//使用9格图绘制面板的背景
mPatch.draw(g2, clip.x, clip.y, clip.width, clip.height);
//*** 关键代码:使用9格图 END
}
public static void main(final String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
frame.setContentPane(new JPanel(new BorderLayout()));
((JPanel)frame.getContentPane()).setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
frame.getContentPane().add(new Test(), BorderLayout.CENTER);
frame.setSize(300,250);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}

【运行效果图】

【附件下载】
测试代码完整Eclipse3.5.2工程(含NinePatch的jar包哦):
http://files.cnblogs.com/jb2011/jb2011blog_testNinePatch.rar
================================================================================
【最后再啰嗦几句】
潜水了很多年,得益于许多无私网友的奉献,越发觉得很有必要与人分享一些东西。接下来将陆续写出“Swing整容”系列文章,
希望对需要的人有用,但因水平确实有限,不喜者还请勿喷,多谢。
有人说,Swing很丑,这话没错,但Swing真的没救了?答案当然是否定的。接下来的文章将会与Swing的L&F有关,谢谢关注。
“民工甲”的“Swing三刀”系列文章给了我最近一次Swing美化工作的部分灵感,非常感谢作者的无私,文章地址是:
http://joshuaxiao.iteye.com/blog/707514。“WilliamChen”的Swing技术文章也是相当不错,可惜多年不更新了,有兴趣的朋
友可以去围观哦,http://blog.sina.com.cn/swingjava。
Swing杂记——Swing中引入Android的NinePatch技术,让Swing拥有Android的外观定制能力的更多相关文章
- Android官方文档翻译 三 1.1Creating an Android Project
Creating an Android Project 创建一个Android项目 An Android project contains all the files that comprise th ...
- 如何在Android应用中引入外部网页
在某些情况下,我们需要在Android应用中引入外部网页,这里记录一下如何操作(其实很简单^.^). 先介绍一下开发环境: 开发工具:Android Studio 1.5 SDK API版本:17 操 ...
- 在Android项目中引入MuPdf
由于公司手机App要加入一个附件查看功能,需要查看PDF文件,在网上找了许多第三方工具,最后选择了MuPDF. 更多第三方工具可以查看大神总结的:http://www.cnblogs.com/poke ...
- 【转】Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)
原文网址:http://www.blogjava.net/anchor110/articles/355699.html 1.在工程下新建lib文件夹,将需要的第三方包拷贝进来.2.将引用的第三方包,添 ...
- Android开发之利用ViewPager实现在Activity或Fragment中引入别的布局文件实现滑动并进行页面跳转
有些时候经常可以看到其他APP中有一排的图标,可以在一个界面中滑来滑去,并且图标可以进行点击事件进行页面的跳转.这里对这种方法的实现做出总结. 首先看一下图片: 下面这两种图片是在一个Fragment ...
- 在Swing的组件中,基本上都是在AWT组件的名称前面加“J”
在Swing的组件中,基本上都是在AWT组件的名称前面加“J”. 一般情况下,除了Choise等组件: import javax.swing.*;好要加上:import java.awt.*以及imp ...
- [转载]android工程中引入另一个工程中的资源
原文地址:android工程中引入另一个工程中的资源作者:87fayuan 在项目中可能遇到这样的问题:项目过大,于是细分为N个子模块来做,每个模块都是不同的工程.涉及到activity传数据时,可以 ...
- 【AI】Android Pie中引入的AI功能
前言 “无AI,不未来”,绝对不是一句豪情壮语,AI早已进入到了我们生活当中.去年Google发布的Android Pie系统在AI功能方面就做了重大革新,本文就对Google在新系统中引入的AI功能 ...
- 在Android中引入Java8的lambda表达式
我用的是retrolambda这个插件,下面来说下如何添加它. 项目地址:https://github.com/evant/gradle-retrolambda 在根项目的build.gradle中添 ...
随机推荐
- CA 证书
1.ubuntu curl 命令报错(CA) kamil@vm-ubuntu:~$ curl https://szxyzs.vanke.com/DataCenter/datacenter/api cu ...
- ecshop 重置后台密码 MD5+salt
ecshop密码加密方式: MD5 32位+salt,简单来说就是明文密码用MD5加密一次,然后在得到的MD5字符后边加上salt字段值(salt值为系统随机生成,生成以后不再改变)再进行一次MD5加 ...
- VS2013编译python源码
系统:win10 手头有个python模块,是用C写的,想编译安装就需要让python调用C编译器.直接编译发现使用的是vc9编译,不支持C99标准(两个槽点:为啥VS2008都还不支持C99?手头这 ...
- 【BZOJ-4692】Beautiful Spacing 二分答案 + 乱搞(DP?)
4692: Beautiful Spacing Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 46 Solved: 21[Submit][Statu ...
- hdu5187 奇怪题
本来很水的,答案就是(2^n)-2,但是写坑了QAQ 因为原题要求答案要mod P,一开始我是这么干的: LL ans=pow_mod(,N,P); ans=(ans-)%P; ) ans=%P; p ...
- centos7安装eclipse
centos7安装eclipse Eclipse是一个集成开发环境(IDE),包含一个基工作区和定制环境的可扩展插件系统.大部分使用 Java 编写,Eclipse 可以用来开发应用程序.通过各种插件 ...
- java server
A easy ajax for java: http://directwebremoting.org/dwr/index.html
- 真机调试之android手机+chrome
真机调试之android手机+chrome 虽然chrome上的移动设备模拟器很强大,但是在真机运行的时候,总会遇到一些小问题,这时就需要使用真机调试了. 第一步:准备一台android手机,并在手机 ...
- php代码加密
<?php function encode_file_contents($filename) { $type=strtolower(substr(strrchr($filename,'.'),1 ...
- uC/OS-II信号(OS_sem)块
/*************************************************************************************************** ...