Swing杂记——Swing中引入Android的NinePatch技术,让Swing拥有Android的外观定制能力...

news/2024/7/4 22:21:49

【摘要】

本文诣在展示如何在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。

转载于:https://www.cnblogs.com/fuzhihong0917/p/5731805.html


http://www.niftyadmin.cn/n/3376636.html

相关文章

Sublime Text 包管理工具及扩展大全

Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能,例如代码缩略图,多重选择,快捷命令等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签&a…

练习瑜伽饮食注意事项

1、在瑜伽的第一节课,老师就严重强调我们的饮食问题,他要求我们,在练瑜伽的这天,中餐只能七八分饱(是说肠胃有余地)食物不过量,肠胃便于消化和吸收! 2、练习完后,不能立即…

mysql启动报错处理

为什么80%的码农都做不了架构师?>>> MySQL 5.7.13 版本,Linux RHEL 6.5 64 版本。 rpm方式安装完mysql后服务启动正常,但服务器重启后再次启动服务报如下错误: 2016-08-03T02:10:29.026752Z 0 [Note] Plugin FEDERATE…

C# 该行已经属于还有一个表 的解决方法

产生错误的代码: DataTable dtContract_src Oper.GetDataTable("select * from T_Contract where ProjectID" ProjectID_src " and Flag0", con_src);foreach (DataRow dr in dtContract_src.Rows){String ContractID_src dr["Contrac…

Jquery UI - DatePicker 在Dialog中无法自动隐藏的解决思路

通过Jquery UI Dialog模态展示如下的一个员工编辑页面,但是遇到一个奇怪的问题:点击Start Date的input元素后,其无法失去焦点。从而导致DatePicker控件在选择日期后无法自动隐藏。 解决思路:给DatePicker加上onSelect事件&#xf…

d3框架项目应用

晚点再写转载于:https://www.cnblogs.com/ey-151210/p/5309967.html

javascript实现非递归--归并排序

另一道面试题是实现归并排序,当然,本人很不喜欢递归法,因为递归一般都是没有迭代法好。所以首选都是用迭代法,但是迭代法确实是难做啊,至底而上的思想不好把握。 这是我的实现代码 /*** 非递归版归并排序,思…

如何在同一系统里同时启动多个Tomcat

需要在同一系统里启动多个tomcat,应该怎么处理? tomcat是个服务程序,需要占用几个通讯端口,所以默认情况是不能启动多个tomcat,如果要启动多个tomcat,需要修改配置文件,通过在配置文件设置不同的通讯端口就可以做到.文件 %TOMCAT_HOME%/conf…