??xml version="1.0" encoding="utf-8" standalone="yes"?> 最q遇C个很奇怪的问题Q写了一个界面程序,刚开始没?讄字体Q效率还可以Q但是默认字体看着比较隄Q就改用了一个字体,谁知道在jdk1.4扚w试q程中,效率居然比原来要低非帔R常的多?br />
后来发现如果是jdk1.5及以上版本两者效率几乎一P见附件截图?br />
而且Swing效率和增强功能来ԌJDK1.6u10及以上版本有非常大的提高Q?br />
所以如果条件运行,q是都改成JDK1.6u10及以上版?/font> 试代码如下:
]]>
技术文章区Q?a >http://twaver.servasoft.com/
中文论坛区:http://twaver.servasoft.com/forum/
]]>
public class FontDemo extends JPanel {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setTitle("TWaver中文C");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setContentPane(new FontDemo());
f.setSize(800, 600);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private TDataBox box = new TDataBox();
private BarChart chart = new BarChart(box);
private static final int times = 1000;
private static final int style = Font.BOLD;
private static final int size = 16;
public FontDemo() {
initBox();
initChart();
initGUI();
}
private void initGUI() {
this.setLayout(new BorderLayout());
JScrollPane pane = new JScrollPane(chart.getLegendPane());
this.add(chart, BorderLayout.CENTER);
this.add(pane, BorderLayout.EAST);
}
private void initBox() {
final List localFonts = new ArrayList();
List nativeFonts = new ArrayList();
// get all available fontFamily names
Font[] fonts = SunGraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
for (int i = 0; i < fonts.length; i++) {
// separate logical and native font
if (SunGraphicsEnvironment.isLogicalFont(fonts[i])) {
localFonts.add(fonts[i]);
}
else {
nativeFonts.add(fonts[i]);
}
}
System.out.println("///////////// localFonts test /////////////");
for (int i = 0; i < localFonts.size(); i++) {
Font font = (Font) localFonts.get(i);
long start = System.currentTimeMillis();
for (int k = 0; k < times; k++) {
createFont(font);
}
long spendTime = System.currentTimeMillis() - start;
Node n = new Node();
n.setName(font.getName());
n.putChartValue(spendTime);
n.putChartColor(Color.GREEN);
box.addElement(n);
// System.out.println(">" + spendTime + "\t" + font.getName());
}
System.out.println("\n///////////// nativeFonts test /////////////");
for (int i = 0; i < nativeFonts.size(); i++) {
Font font = (Font) nativeFonts.get(i);
long start = System.currentTimeMillis();
for (int k = 0; k < times; k++) {
createFont(font);
}
long spendTime = System.currentTimeMillis() - start;
Node n = new Node();
n.setName(font.getName());
n.putChartValue(spendTime);
n.putChartColor(Color.RED);
box.addElement(n);
// System.out.println(">" + spendTime + "\t" + font.getName());
}
System.out.println("\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
}
private void createFont(Font font) {
// font.deriveFont(style, size);
new Font(font.getName(), style, size);
}
private void initChart() {
chart.setLegendLayout(TWaverConst.LEGEND_LAYOUT_VERTICAL);
chart.setLegendOrientation(TWaverConst.LABEL_ORIENTATION_HORIZONTAL);
chart.setYScaleTextVisible(true);
chart.setShadowOffset(1);
}
}
1.4试l果
1.6试l果
q去数年_Ҏ公司的发展历E恰D天火的发射q程———一pd快速紧密有序的爆炸而后直冲苍穹。苹果公司本w,它的领导者及它的产品已经变成了一U文化上的通用语。戴公司想成ؓ商业领域的苹果公司,Zipcar亦想在汽车共享领域成果公司,戏剧演员比尔·马赫甚至_如果Ҏ公司总裁做ȝQ政府将能提供更好的服务?/span>
一个公司或个h怎样才能成ؓ“某某领域的苹?#8221;Q在与苹果公司前雇员Q现d伙h以及其他一些长期关注苹果的专业人士q行探讨交流后,我们可以清晰地看到这个问题的{案Q它们围l以下十大关键因素展开?/span>
1
不落俗套
?1980q代领导Ҏ工作团队设计产品Ӟ?#8220;W记?/span>看v来应该像什?#8221;q个问题上,斯蒂?#183;乔布斯经怺自指导工E师们?#8220;有一ơ他在百货商店看C个异常精的厨具”Q安q?#183;赫兹菲尔徯Q?#8220;然后他就要求设计师把W记本设计成他看到的那个模样”“q有一ơ他要设计师把品设计成保时L模样”。安q?#183; 赫兹菲尔hҎ创始工程师之一Qƈ著有《硅谷里的革命:Ҏ公司成长的伟大历双Ӏ一书?/span>
计算机看h更应该像跑R和厨P而苹果公司的q随者恰是高端h———那些已买或者是买保时L人。很明显Q仅通过跟随谷的市场动向,通过技术专家或是其它俗套的设计Q你很难吸引他们。而苹果的力Q恰恰在于自己钻研,从而不落俗套地吸引其目标客戗?/span>
2
逾越常规
技术专家普遍认为,源代码开放是大势所,且体现共享原则。在q一背景下,Ҏ被视为略昑ְ闭?/span>
但在Ҏ的哲学里Q封闭与自由q不冲突?#8220;我们正竭所能的让用户体验到预想效果Q?#8221;乔布斯在l莱?#183;塔特的电子邮件中写道。此前,莱恩在博客中抨击Ҏ止在iPhone和iPad上用Flash技术?#8220;你可以不赞同我们Q但我们的动机是U洁的?#8221;乔布斯写道,“止该技术是因ؓҎ商店提供了太多自由,你能买到盗取个h隐私的程序,也能买到摧毁甉|的程序,q能买色情媄片?#8221;
管如此Q程序员们一直抱怨苹果商店过于封闭,他们认ؓҎ商店在设计应用程序上一直持独裁态度。即问题不在于它是封闭的Q而在于它在规则制定方面是独断专行的,隐蔽的,频繁变动的。如果苹果公司能攑֮透明度,p避免上述大部分争议?/span>
但根本上Q苹果不在乎争议。虽然批判仍在持l,但是Ҏ商店已经取得了巨大的成功Q就q其反对者也不得不承认它极其便捷且妙横生?/span>
3
拒绝复杂
“拒绝”可能是乔布斯在苹果公司所扮演的首要角艌Ӏ?#8220;他简直是个过滤器Q?#8221;Ҏ电脑工程师赫兹菲d说。每一天都会有设计者向乔布斯展C关于新产品和在现有产品上加入新特征的创意,而他的回{几乎都是拒l?#8220;我ؓ那些我们没有d的品感到骄Ԍ正如同我为那些我们做出来的品感到骄傲一栗?#8221;乔布斯在 2004q接受采访时说?/span>
乔布斯拒l的原因Q不仅出于对复杂设计的一贯反感,q有成本考虑Qƈ刉期待效应。对一些复杂的设计说不可以使成本降得更低,减少一些品的特征q能刉一U期待?#8220;故意忽略一h们想拥有的品特征,会激发h们对它的渴望?#8221;Ҏ公司的前工程师雷徯Q?#8220;当你在新版本中将q个功能加入Ӟ用户得偿所愿,则更加高兴?#8221;
Ҏ公司一遍又一遍地q用着q个{略Q最新的例子是iPhone O S4Q它d了多d操作功能。事实上Q该功能用户们从2007qv开始要求。再来看看iPadQ真的没法添加摄像装|吗Q?/span>
4
服务客户
不管你的产品有多好,它L出问题的时候。近q来Q在W记本和手机领域Q苹果的竞争Ҏ们大多采取回避客戯非服务客户的策略。它们关掉了自n的客h务部门,q将q项业务外包l由低薪员工l成的电话服务中心。它们甚臌客户自己ȝ上寻扑ָ见问题的解答?/span>
而二十年前,Ҏ公司制订零售{略Ӟ明了一个压倒一切的优先目标Q即创立一U让客户完全联想不到计算机工业的零售商店。他们致力于在商店中营造一U类似四季酒店大堂的友好氛围?/span>
G eniusB ar 便是代表。G eniusBar里的工作人员会ؓ你诊断每一ƾ苹果公司的产品Q而不你从哪里买的。除非过了保质期Q公司对上述服务不收取Q何费用。苹果公ؓ何如此慷慨呢Q曾在G enius Bar工作q的德尔_“有时候客戯来时是ؓL帮助Q但在离开时却购买了新产品?#8221;
5
忽略意见
乔布斯L在各U场合频J引用亨?#183;特的名aQ?#8220;如果我问客户他们需要什么,他们L说要‘一Ҏ快的马!’”
乔布斯用q句话,来说明苹果公司所信奉的哲学,即h们预想不C们真正需要的东西。客户会告诉你一大堆他们所需要的东西Q但是当你按照他们的意图刉出来时Q这又不是他们想要的。将那些不存在的东西Ş象化Qƈ不是一件容易的事?/span>
不过乔布斯也不是客L反馈视ؓ无物。他其看做是鼓舞,而非方向Q是方式Q而非l果。所以苹果L能推出既能满_户需求同时又越客户惌的新产品?/span>
6
处处营销
如同G enius Bar已被证明是天才创意一P如今风行全球的苹果宣传口?#8220;换种方式思?#8221;也被证明不是IQ因果粉丝们的思考方式确实与众不同。粉丝对Ҏ的忠诚度堪比基督徒对耶稣的忠诚度。苹果的品牌是如此的强大和有吸引力,以至于对有些言Q苹果已l成了一U信仰?/span>
Ҏ公司通过一pd_入微的方式,来培ȝ丝对Ҏ品牌的宗教般的狂热。包括渲染品的秘{。而最重要的方式,是强化苹果品的象征意义Q最有效的市销{略则植根于产品本n。苹果公司用颜色、声韟뀁Ş状等元素的组合,构徏了清晰的品牌形象。苹果通过q些{略使其品牌形象深植人心?/span>
q一点在Ҏ发布C品时表现得尤为明显。通过一pdl一协调的步骤,Ҏ调动大众的胃口,吸引更多人关注。在公众的注意力高度集中ӞҎ再适时对外公布其早准备好的信息或C品。这一切都是围l着营销q行的?/span>
7
推陈出新
如果有天Ҏ推出了一ƾ没有桌面的电脑Q请不要感到惊讶?/span>
仅仅是惛_Q绝对不是,q些都将写进Ҏ的专利申h仉。虽然还没有看到q些产品Q但我们丝毫不应怀疑苹果的创新能力。事实上Q没有Q何一家公司像Ҏ那样频繁地对所在领域的基础环节q行反思和重构。仅仅在q去的短短几q间Q苹果公司就对其W记本电脑的生工艺q行了大q度革新Q这也是W记本生产设计领域有史以来所q行的最q捷最大规模的革新Q除Ҏ外,没有M其它公司做到q些?/span>
Ҏ完全无视IT领域所的兼Ҏ的概念Q这对诸如微软这L竞争者来说是亦是祸。在Ҏ公司的历史上Q它数次采用新的操作pȝ和新的芯片构造,q些军_L使它原来的生产组装基地立d得过时。苹果L不停地否定过去设计中的不合理及不之处,不断地推陈出斎ͼ使其产品总能以独特的风格傲立于时代前ѝ?/span>
8
适当“独裁”
2000q_作ؓҎ阿斯塔特国业务分部的运营经理,麦克·伊万杰李斯特负责D V Dd技术研发,卛_q种D V D装在高端电脑上,q且在未来将其{变ؓiD V D。该目界面呈现出来的,是多U多LH口和菜单选项Q以及大D늚功能解释文字?/span>
“q时乔布斯走了进来,”伊万杰李斯特回忆_“他没有仔l看我们的工作,而是在白板画了一个框?#8221;“q就是新设计?#8221;乔布斯说Q?#8220;只要一个窗口,音像资料推入窗口,然后点击一个叫播放的按钮,q是我们要的?#8221;
“所有h呆若木鸡Q?#8221;伊万杰李斯特_q种风格与他以前所p的公司E异。技术领域追求具有包Ҏ的、彻底的、集合大众智慧的创新。而苹果的工程师则要花?100%的时间去设计׃部分资q理或是乔布斯一个h计划的品。有权做出决{的人是如此之少Q以至于Ҏ一q仅能够推出一Ҏ两项创新产品?/span>
9
重新发明
“革命?#8221;是乔布斯最喜欢的词之一。他极力夸赞Ҏ的每个发明创造都是独一无二的和有创造性的?/span>
Ҏ的品到底具不具有革命性,取决于我们对革命性这个词的定义。苹果公司擅于搜集汇L术领域的最新创意,q过转化其变ؓ己有。苹果擅长发现别的同cM品上存在的问题和不Qƈ在其推出的品上上q问题和不予以解决Q或者是对货架上的其它同cM品在Ҏ的模式下q行改良革新?/span>
iPad 是一个典型例子。早?001q?/span>比尔·盖茨推Z一Ƒօ备几乎相同功能的建立在w indow s操作pȝ基础上的产品Q但是当时在交互界面Q应用Y件开发方面存在诸多需要解决的问题Q微软公司就没有l箋坚持下去。乔布斯发现在苹果公司现有的技术基上,上述的问题都不成其ؓ问题Q于是iPad横空Z。在刚推出的两个月里QiPad卖Z200万台?/span>
10
有条不紊
?iPad上市几周后,惠普、微软及其它一些公司相l推q了同类产品的上市。它们正试图制作出比iPad更加_֯、功能更加齐全的产品。它们正致力于创造自q本的‘快马’Q于是它们推q面市,又回C设计室。与此同ӞҎ的其它竞争者如GoogleQIntel{也快马加鞭地在该领域排兵布c?/span>
Ҏ公司q没有ؓq种竞争态势所牵制Q它严格地按照自q旉表行事。苹果公司的旉表是严格按照其自w的l营{略和长期愿景目标来制定的,其受市场态势和竞争者状늚影响较ؓdQ这栯果公司总能掌握d权,适时地推Z些新产品Q占市场先机?/span>
JavaGUI应用E序部v
JavaGUIE序发布分类
1) AppletQ可以嵌入到览器中Q通过|页的方式展C给用户
2) application Q有两种发布方式
ü 打包成jar包通过bat的方式运行,或者通过W三方Y件打成exe(后箋会再详细介绍)
ü 通过Java Web Start的方式发布到服务器端Q通过JNLPq行
相对来说W二U方式可能更好一些,免除了更新的ȝ?/span>
用applet或者jws的方式发布,大部分都需要数字签名?br />
Z么要{
其实{不是必须的,如果你的E序只是单纯的绘图,昄Q只要不讉K|络资源也不讉K本地文gQ是不用{的,
但是如果要访问本地或|上资源必ȝ名,
比如d本地文g或者访问数据库Q这是由java的沙机制决定的Q即jvm内部有一l安全检查规则,要通过查之后才能访问特定资源?/span>
如果要突破这个规则,可以有两个方?
1) 修改jre权限文g如下
java.policy为grant {
permission java.security.AllPermission;
};
一般权限文件的目录如下C:"Program Files"Java"jre6"lib"security
但是修改每个客户端的权限文gQ无Z旉q是操作上都是很ȝ的?/span>
2) {Q意思就是告诉用Pq个E序是谁发布的,是不是能信QQ如果客L定,okQ这个applet或者jws可以访问外部资源了?br />
如何{
1)首先保你已l完全安装了Java2的环境,有keytool工具Q它位于JDK的bin目录下。这一般不会有问题?/span>
2)到Dos状态下Q进入你需发布应用E序的jar包所在的目录Q运行下面这句话
keytool -genkey -keystore myKeystore -alias jwstest -validity 1000
它将会提CZ输入用户名、密码等Q按照提C随便输入即可,不输入直接回车即可,
但一定要C密码。运行结束它会在当前\径下创徏名ؓmyKeystore的文件?/span>
3)如果你想查看一下刚才生成的myKeystore文g的内容,可以使用下面q句话:
keytool -list -keystore myKeystore
昄出来应该cM如下Q?br />
Keystore type: jks
Keystore provider: SUN
Your keystore contains 1 entry:
jwstest, Tue Nov 23 19:29:32 PST 2001, keyEntry,
Certificate fingerprint (Test):
C3:A9:CD:F3:D3:AC:4D:3F:3C:5B:AF:9E:CF:0D:46:5C
4)对你需发布应用E序的jar包进行签名,q行下面q句话:
jarsigner -keystore myKeystore yourtest.jar jwstest
其中yourtest.jar是你的jar包名Q你需要修改它Q别的就不必修改了?br />
q行时会提示你输入密码,是你刚才在生成myKeystore文g时设定的密码?br />
如果有很多jar包怎么?/span>
在开发的q程中很可能会引用到W三方的jar包,而第三方的jar包又可能引用到其它的Q所以可能有很多的jar包,需要和applet一起发布,有两个方?br />
1) 分别打包{Q用于包比较少Q比如只??个的情况
2) ?把applet的jar包签名,让用L认访问授权,applet已经被用h权,那么可以在applet里改变安全管理器QSecurityManagerQ?br />
只需要承SecurityManagerc,创徏自己的安全管理器c,然后覆盖checkPermissionҎQ允许访问Q何资源?br />
在applet的initҎ中调用System.setSecurityManager把安全管理器讄为我们自定义的即可?/span>
class CustomManager extends SecurityManager {
public void checkPermission(Permission perm, Object context) {
}
public void checkPermission(Permission perm) {
}
}
其它一些相兌料如?/span>
JDK中keytool常用命o
-genkey 在用户主目录中创Z个默认文?.keystore",q会产生一个mykey的别名,mykey中包含用L公钥、私钥和证书
-alias 产生别名
-keystore 指定密钥库的名称(产生的各cM息将不在.keystore文g?br />
-keyalg 指定密钥的算?nbsp;
-validity 指定创徏的证书有效期多少?br />
-keysize 指定密钥长度
-storepass 指定密钥库的密码
-keypass 指定别名条目的密?br />
-dname 指定证书拥有者信?例如Q?nbsp; "CN=sagely,OU=atr,O=szu,L=sz,ST=gd,C=cn"
-list 昄密钥库中的证书信?nbsp; keytool -list -v -keystore sage -storepass ....
-v 昄密钥库中的证书详l信?br />
-export 别名指定的证书导出到文?nbsp; keytool -export -alias caroot -file caroot.crt
-file 参数指定导出到文件的文g?br />
-delete 删除密钥库中某条?nbsp; keytool -delete -alias sage -keystore sage
-keypasswd 修改密钥库中指定条目口o keytool -keypasswd -alias sage -keypass .... -new .... -storepass ... -keystore sage
-import 已{数字证书导入密钥?nbsp; keytool -import -alias sage -keystore sagely -file sagely.crt
导入已签名数字证书用keytool -list -v 以后可以明显发现多了认证N度,q且把整个CA铑օ部打印出来?/span>
Keytool 是安全钥匙与证书的管理工?它管理一个存储了U有钥匙和验证相应公共钥匙的与它们相兌的X.509 证书铄keystore(相当一个数据库).
Keytool 是一个有效的安全钥匙和证书的理工具. 它能够用户使用数字{来管理他们自qU有/公共钥匙?理用来作自我鉴定的相关的证?理数据完整性和鉴定服务.它还能用户在通信时缓存它们的公共钥匙.
一个证书是某一实体(个h,公司{?的数字签?指出其他实体的公共钥?或其他信?的详l的?当数据被{?q个{信息被用来检验数据的完整性和真实?完整性指数据没有被修改和改,真实性指数据从Q何生和{的一方真正的传输到达.
Keytool 把钥匙和证书储存C个keystore.默Q的实现keystore的是一个文?它用一个密码保护钥?
而另外的一个工具jarsigner用keystore中的信息产生或检验Java aRchive(jar文g)中的数字{.
Keystore有两个不同的入口:
1.钥匙入口:保存了非常敏感的加密的钥匙信?q且是用一个保护的格式存储以防止未被授权的讉K.以这UŞ式存储的钥匙是秘密钥?或是一个对应证书链中公有钥匙的U有钥匙.
2.信Q证书入口:包含一个属于其他部分的单一公共钥匙证书.它之所以被UCؓ"信Q证书",是因为keystore信Q的证书中的公共钥匙真正属于证书所有者的w䆾识别.
Keystore的别?
所有的keystore入口(钥匙和信任证书入?是通过唯一的别名访?别名?不区分大写?如别名Hugo和hugo指向同一个keystore入口.
可以在加一个入口到keystore的时候?genkey参数来生一个钥匙对(公共钥匙和私有钥?时指定别?也可以用-import参数加一个证书或证书铑ֈ信Q证书.
?
keytool -genkey -alias duke -keypass dukekeypasswd
其中duke为别?dukekeypasswd为duke别名的密?q行命o的作用是产生一个新的公?U有钥匙?
假如你想修改密码,可以?
keytool -keypasswd -alias duke -keypass dukekeypasswd -new newpass
旧密码dukekeypasswd改ؓnewpass.
Keystore的?
1.当?genkey ?import?identitydb命od数据C个keystore,而当q个keystore不存在时,产生一个keystore.默认名是.keystore,存放到user-home目录.
2.当用-keystore指定?生指定的keystore.
Keystore的实?
Keytool cM于java.security包下,提供一个非常好的接口去取得和修改一个keystore中的信息. 目前有两个命令行:keytool和jarsinger,一个GUI工具Policy 可以实现keystore.׃keystore是公开?用户可以用它写一些额外的安全应用E序.
Keystoreq有一个sun公司提供的內在实?它把keystore作ؓ一个文件来实现.利用了一个keystorecd(格式)"JKS".它用单独的密码保护每一个私有钥?也用可能不同的密码保护整个keystore的完整?
支持的算法和钥匙大小:
keytool允许用户指定钥匙对和注册密码服务供应者所提供的签名算?~省的钥匙对产生法?DSA".假如U有钥匙?DSA"cd,~省{法?SHA1withDSA",假如U有钥匙?RSA"cd,~省法?MD5withRSA".
当生一个DSA钥匙?钥匙必须?12-1024位之?对Q何算法的~省钥匙大小?024?
证书:
一个证书是一个实体的数字{,指出其他实体的公共钥匙有明确的?
1.公共钥匙 :是同一个详l的实体的数字关?q有意让所有想同这个实体发生信dpȝ其他实体知道.公共钥匙用来验签?
2.数字{:假如数据已被{,q用w䆾存储在一个实体中,一个签名能够证明这个实体知道这个数?q个数据用实体私有钥匙签名ƈ递交;
3.w䆾:知道实体的方?在一些系l中w䆾是公共钥?其他pȝ中可以是从一个X.509名字的邮件地址的Unix UID来的M东西;
4.{:一个签名用用实体私有钥匙来计算某些加密数据;
5.U有钥匙:是一些数?每一个私有钥匙只能被特定的拥有该U有钥匙的实体知?U有和公共钥匙存在所有用公共钥匙加密的系l的钥匙对中.一个公共钥匙加?如DSA),一个私有钥匙与一个正的公共钥匙通信.U有钥匙用来计算{.
6.实体:一个实体可以是一个h,一个组l?一个程?一台计机,一个商?一个银?或其他你想信ȝ东西.
Keytool应用实例:
1.产生一个keystore:
keytool -genkey -alias User(keystore的别? -keyalg RSA -validity 7 -keystore keystore(指定keystore).
q行q个命o,pȝ提示:
Enter keystore password:yourpassword(输入密码)
What is your first and last name?
[Unknown]: your name(输入你的名字)
What is the name of your organizational unit?
[Unknown]:your organizational(输入你所在组l单位的名字)
What is the name of your organization?
[Unknown]:your organization name (输入你所在组l的名字)
What is the name of your City or Locality?
[Unknown]:your city name(输入所在城市的名字)
What is the name of your State or Province?
[Unknown]:your provice name(输入所在省份名?
What is the two-letter country code for this unit?
[Unknown]:cn(输入国家名字)
Is CN=your name, OU=your organizaion, O="your organization name",
L=your city name, ST=your province name, C=cn correct?
[no]: yes
2.查一个keystore:
keytool -list -v -keystore keystore
Enter keystore password:your password(输入密码)
显Ckeystore內容?
Keystore type: jks
Keystore provider: SUN
Your keystore contains 1 entry
Alias name: yourname
Creation date: Dec 20, 2001
Entry type: keyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=yourname, OU=your organization, O="your organization name",
L=your city name, ST=your province name, C=CN
Issuer: CN=Duke, OU=Java Software, O="Sun Microsystems, Inc.", L=Palo Alto, ST=CA, C=US
Serial number: 3c22adc1
Valid from: Thu Dec 20 19:34:25 PST 2001 until: Thu Dec 27 19:34:25 PST 2001
Certificate fingerprints:
MD5: F1:5B:9B:A1:F7:16:CF:25:CF:F4:FF:35:3F:4C:9C:F0
SHA1: B2:00:50:DD:B6:CC:35:66:21:45:0F:96:AA:AF:6A:3D:E4:03:7C:74
3.输出keystoreC个文?testkey:
keytool -export -alias duke -keystore keystore -rfc -file testkey
pȝ输出:
Enter keystore password:your password(输入密码)
Certificate stored in file < td>
4.输入证书C个新的truststore:
keytool -import -alias dukecert -file testkey -keystore truststore
Enter keystore password:your new password.(输入truststore新密?
5.查truststore:
keytool -list -v -keystore truststore
pȝ显Ctruststore的信?
现在可以用适当的keystoreq行你的应用E序.?
java -Djavax.net.ssl.keyStore=keystore -Djavax.net.ssl.keyStorePassword=password Server
? java -Djavax.net.ssl.trustStore=truststore
-Djavax.net.ssl.trustStorePassword=trustword Client
by
张涛
zht_dream@hotmail.com
很多时候,我们需要在界面初始化以后对E序q行某些讄QD个例子,当界面呈现出来以后,讄?/span>SplitPane的的癑ֈ?/span>(关于q个Z么必这么处理请参?/span>java源代?/span>)。很Ҏ我们想到给E序dComponentListener监听Q然后在监听中作处理Q如下所C?/span>
panel.addComponentListener(new ComponentAdapter() {
public void componentShown(ComponentEvent e) {
System.out.println("panel:shown");
}
});
但是q没有和我们惌的那P当组件在界面上显C出来的时?/span>fire?/span>componentShowncd的事件的Q下面我们通过研究源代码分析下原因
首先的问题是在什么地方会fire?/span>ComponentEvent
通过查看源代码,我们可以看到实在Component?/span>show()Ҏ?/span>
ComponentEvent e = new ComponentEvent(this,ComponentEvent.COMPONENT_SHOWN);
Toolkit.getEventQueue().postEvent(e);
具体代码Q请参?/span>java源程?/span>
也就是说只有在组件调用到setVisible(true)的时候才?/span>fire?/span>ComponentEvent
但是你会发现Q即便是我们调用JComponent?/span>setVisible(true)Q也不会监听?/span>shown事g
原因主要?/span>JComponent重蝲?/span>setVisibleҎ
如下
public void setVisible(boolean aFlag) {
if(aFlag != isVisible()) {
super.setVisible(aFlag);
Container parent = getParent();
if(parent != null) {
Rectangle r = getBounds();
parent.repaint(r.x,r.y,r.width,r.height);
}
// Some (all should) LayoutManagers do not consider components
// that are not visible. As such we need to revalidate when the
// visible bit changes.
revalidate();
}
}
因ؓJComponent?/span>visible属性默认就?/span>trueQ所以不会调用到Component?/span>setVisibleҎQ所以也不会fire?/span>ComponentEventQ当Ӟ如果你调用下JComponent?/span>setVisible(false)+setVisible(true)是会fire?/span>ComponentEvent.COMPONENT_SHOWN事g的,Q但是在里面很可能得不到当前lg的大信息或者不?/span>SplitPane讄分割比例Q因个时候界面还没有初始化)Q而且如果?/span>JFrameQ?/span>JDialogQ?/span>JApplet{也是没问题的,因ؓ他们调用的都?/span>Component?/span>setVisibleҎ(所以给q些层lgdComponentListener是没有问题的Q都会监听到)
如果不想使用上述ҎQ还有另外一U方式就是添?/span>HierarchyListener监听Q因为当层lg(JFrame,JDialog{?/span>)setVisible(true)界面昄的时候,里面都会fire?/span>HierarchyEventQ具体代码如?/span>(详细代码请参?/span>Component?/span>show()Ҏ)
createHierarchyEvents(HierarchyEvent.HIERARCHY_CHANGED,
this, parent,
HierarchyEvent.SHOWING_CHANGED,
Toolkit.enabledOnToolkit(AWTEvent.HIERARCHY_EVENT_MASK));
?/span>createHierarchyEventsҎ会在每个lg?/span>fire?/span>HierarchyEventQ至于具体细节,有时间的可以dubug下,具体的解x法如?/span>
panel.addHierarchyListener(new HierarchyListener() {
public void hierarchyChanged(HierarchyEvent e) {
if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) {
if (e.getComponent().isShowing()) {
System.out.println(panel.getBounds());
System.out.println("panel:hshow");
}
else {
System.out.println("panel:hhide");
}
}
}
});
试代码如下