swing 是设计桌面应用程序的一个功能非常强大工具包,但swing因为曾经的不足常常遭到后人的诟病.常常听到旁人议论纷纷,”swing 运行太慢了!”,”swing 界面太丑嘞”,甚至就是说”swing 简直食之无味”. 从swing被提出到现在,已是十年光景,swing早已不是昔日一无是处的swing了. chris adamson 和我写了一本<<swing hacks>>,为得就是要说,今天的swing可以使你不费力地设计出运行快速,界面美观,功能实用的应用程序.而你所需的只是一些技巧.
版权声明:任何获得matrix授权的网站,转载时请务必保留以下作者信息和链接
作者:joshua marinacci;leniz(作者的blog:http://blog.matrix.org.cn/page/leniz)
原文:http://www.onjava.com/pub/a/onjava/2005/08/10/swinghacks.html
译文:http://www.matrix.org.cn/resource/article/44/44234_hacking+swing.html
关键字:swing;hacking
这篇文章将介绍六个非正式的属性,类和特性,而所有的这些将助你从swing中成功突围.本文是基于某几种swing破局之法, 而出于这样或那样的原因这些技巧并没有加入到<<swing hacks>>一书中.有些是过于短小不足以自成章节,有些则是不适合独立成章,而有些是直到我们的书出版了才获悉(技术不等人呀!).幸运的是,inte.net为我们开辟了一条通向技术发展最前缘的路径.不过,请记住非正式的属性是基于某特定的jvm平台和版本的.它们有可能在一个新的版本中消失,所以要很小心的使用它们,并准备好后援.
从windows的任务栏隐藏一个frame
每个frame都会在windows的任务栏以某个图标表示自己的存在.如果你使用的是window xp 系统,那么这些图标可能会折叠起来,除了不能直接看到,它还是实实在在存在的.然而以继承java.awt.window 类替代继承java.awt.frame类,你的窗口可以在任务栏隐藏起来,同时在alt-tab(任务切换组合键)的切换任务选择窗口中也不会出现. 原因就在于window不会以一个完全的”程序窗口”向系统注册(register),这样系统就会另当别论地特殊对待它.此时,这个窗口更像是以一个对话框.的身份出现.
直接从window类继承,有一个很不好的地方,就是你得到的是一个没有任何窗口元素修饰的窗口. 标题栏,以及最大化,最小化和调整大小按键都会消失.就连边框,都不会出现.不过,这要根据我们的具体使用情况,因为某些情况下完全可以不要理会这些.比如调色板工具栏,没有边框,照样运行良好,同时也在任务栏很好的隐藏了自己.另,目前非常流行的小型化程序开发(tiger dashboard,yahoo widgets),也告诉我们没有标题栏也不会存在什么问题.
让mac os 的 x 的窗口变成透明的(真正的透明)
mac os 的x 拥有一个叫quartz的图像api,也就是这个quartz使得生成透明效果的窗口变得触手可及. java并不可以直接地接触到这个api.,但是apple公司的开发人员提供了一个使用quartz的很好特性.如果你想使得的frame的背景有局部具有透明效果,即可以通过这个透明局部看到这个局部原来可能遮挡的桌面或其它程序. 比如,你有一个具有几个按键的frame,你可以在设置frame之前调用
frame.setbackground(new color(0, 0, 0, 0));
通过这个设置,可以把背景完全地透明化,即它所覆盖的桌面和其它程序原处于个几个按键之间的空隙部分的,现在可以完完全全地看到了.接下来的一行,可以使得背景为红色,且处于百分之五十的透明度,也就是说,原本frame遮挡的东西不单可以看到,而且带有红色薄纱的效果.
frame.setbackground(new color(1, 0, 0, 0.5f));//很遗憾window下好像不起作用
这个背景设置,只会影响frame自身,而不会干扰的frame上面的组件.如果你也想这些组件也变得透明,那么必须单独地设置这些组件的背景色,甚至可以通过这个效果,借助设置一个拥有透明圆环的png图片作为主panel的背景来生成一个圆盘状的窗口.原来的图片部分的透明圆环,同样会对frame起作用,即可以看到图片透明圆环所遮挡的桌面或其它程序,如此这般,生成一个视觉上的规则外形窗口.
弹动的mac os x的dock 图标
mac os x 引进一个新的提醒方式:弹动的dock 图标.这些图标出现在屏幕的下方(当然这取决于你的配置),它代表的是当前你的运行的程序.现在可以使得这些dock图标弹动,借此达成开发人员意图提醒用户的目的.一次弹动代表一个普通的提醒,比如收到一份新的邮件.而连续的弹动,可能代表的就是急切需要用户注意的东西(比如一次错误的写盘操作可以归入此类).因为这是mac os的特有属性,所有没有针对它的标准api,apple也选择了不把这个属性添加到官方的api中.然而,这是一个可以做出成绩的class,尽管它是一个非正式的类.
apple将它的所有的cocoa api和java 的类一起打包.这些类实质上并没有说明文档,但是通过参考cocoa apis,大抵可以知晓八九.这个
com.apple.cocoa.application包包含一个nsapplication对象,这个对象有很多非常实用的方法.特别是拥有你想要的requestuserattention() 方法, 也就是产生上面我们提及的使得dock图标弹动的方法.
import com.apple.cocoa.application.*;
// ...
public void bouncedock() {
nsapplication app = nsapplication.sharedapplication();
int id = app.requestuserattention(
nsapplication.userattentionrequestcritical);
}
// ...
public class largeicontest {
public static void main(string[] args) throws exception {
// create a file instance of an existing file
file file = new file(args[0]);
// get metadata and create an icon
sun.awt.shell.shellfolder sf =
sun.awt.shell.shellfolder.getshellfolder(file);
icon icon = new imageicon(sf.geticon(true));
system.out.println("type = " + sf.getfoldertype());
// show the icon
jlabel label = new jlabel(icon);
jframe frame = new jframe();
frame.getcontentpane().add(label);
frame.pack();
frame.show();
}
}java -dswing.defaultlaf=com.sun.java.swing.plaf.windows.windowslookandfeel
myapp.mainclass
// show the lines in a jtree
tree.putclientproperty("jtree.linestyle", "angled");
// hide the lines in a jtree
tree.putclientproperty("jtree.linestyle", "none");
java -dswing.boldmetal=false myapp.mainclass
toolbar.putclientproperty("jtoolbar.isrollover",boolean.true);
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 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器