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中添 ...
随机推荐
- Fiddler Post Debug
Content-Type: application/json; charset="UTF-8"
- python面向对象
1.概念 类:(class):具有相同属性和方法的对象的集合.用来定义该集合中每个对象所共有的属性和方法.对象是类的实例. 方法:类中定义的函数. 实例化:创建一个类的实例,类的具体对象. 对象:通过 ...
- python-汉诺塔递归实现
摘录自廖雪峰老师教程下的评论,个人备忘,脑细胞已死光 def move(from,to): #将盘子从from移动到to,动画效果需要脑补 print(from,'->',to) def han ...
- 为什么你不应该用angularjs?
AngularJS的问题 为什么你不该用angularjs,https://medium.com/@mnemon1ck/why-you-should-not-use-angularjs-1df5ddf ...
- 【poj1091】 跳蚤
http://poj.org/problem?id=1091 (题目链接) 题意 给出一张卡片,上面有n+1个数,其中最大的数为m,每次可以向前或者向后走卡片上面的步数.问有多少种方案选出n个数组成一 ...
- Android数据存储-文件操作
一.预备知识 1.Android中的MVC设计模式 MVC (Model-View-Controller):M是指逻辑模型,V是指视图模型,C则是控制器.一个逻辑模型可以对于多种视图模型,比如一批统计 ...
- Linux.BackDoor.Chikdos/Elknot Attack And Defense Analysis
catalogue . 恶意程序概述 . 模块分解 . 通信协议 . 木马清理 1. 恶意程序概述 Trojan.Chikdos.A是一个木马,它允许远程攻击者利用受感染计算机发动DDoS攻击 . 木 ...
- iOS Keychain钥匙串,应用间数据共享打造iOS上的全家桶
Demo先行:https://github.com/rayshen/GIKeychainGroupDemo 该demo里有2个工程,你先运行任何一个会存储一个值,再运行另一个会访问之前的app存储的值 ...
- POJ 1236 Network of Schools(强连通分量/Tarjan缩点)
传送门 Description A number of schools are connected to a computer network. Agreements have been develo ...
- 屠蛟之路_集木成舟_ForthDay
下数据库大山,行数里至水岸,无边无际的东海便豁然展现在屠蛟少年的眼前. 要想到达东海之中的蛟灵岛绞杀beta怪蛟,夺回心爱的小公举,少年们首先需要一艘经得起风浪的船.毕竟海上之路暗涌潜伏.同样凶险万分 ...