2006年4月16日
#
摘要: 我犹豫了好一阵才决定写JavaFX的语法部分。个人认为这是学习中最枯燥的部分。因为JavaFX的语法非常简单且直观,比如Sun提供的在线 Tutorial的GUI部分,即使你是第一次听说JavaFX这个东西,只要你稍有一点点编程经验,你也基本上能够毫无障碍地理解这个Tutorial 的内容了。
话虽如此,部分语法可能确实会造成一些理解困难,比如有的地方分隔符用逗号(,)分号(;)和空格都可以,def和var的区别,=>操作符,等等这些还得初看一遍语法才能理解(当然,基本上就没有必要看第二遍了吧)。因此,我也在此将JavaFX的语法照着Sun的语法 Tutorial快速地过一遍,为以后打下一个坚实(!)的基础,呵呵。
阅读全文
/**
以前写了一个JavaFX入门例子,但由于JavaFX正式版中变化较大,那个例子已无法在正式版中运行,因此重写,标题叫1u1,也是遵守Sun的更新规范,代表update1,呵呵
文:西门町学士
*/
08
年12月4日,Sun正式发布了JavaFX1.0。JavaFX在演进过程中发生了很多的变化,因此,我以前写的JavaFX的第一个
HelloWorld的例子已经无法在正式版下运行,于是在这里重写那个例子。而新的API我也还没有开始学习,只好大略地浏览了一遍API就草草写就,
因此,这个例子虽然在1.0版下正确运行,却未必就是最适合的写法,以后如发现问题再来update2吧,呵呵……
正式版中很多包的命名有了天翻
地覆的变化,class的位置和名称很多也面目全非。比如GUI这块就经历了由javafx.ui变化成javafx.gui再变化成
javafx.scene和javafx.application再进化成javafx.scene和javafx.stage,而跟Swing相关的组
件也统统加上了Swing前缀。有的class我已经找不到了,比如以前的javafx.ui.MessageDialog,我在1.0中没有找到对应的
class,只好直接叫用javax.swing.JOptionPane了。好了,废话不说了,贴新代码如下:
package sc.tmp;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.ext.swing.SwingButton;
import javax.swing.JOptionPane;
/**
* @author stevech
*/
Stage {
title: "Application title"
width: 250
height: 80
scene: Scene {
fill: Color.ORANGE
content: SwingButton {
text: "Click"
action: function():Void {
JOptionPane.showMessageDialog(null, "Have Fun!\nThis is your first JavaFX app!")
}
translateX: 90 translateY: 10
}
}
visible: true
}
结果如图:
摘要: JavaFX出来已经很长一段时间了。一直在计划跟进,可是因为比较懒,现在才慢慢地学习。这里就暂做做学习总结的地方吧。
虽然是总结,我还是打算写详细一点。本来我对JavaFX了解也不是很多,有的东西还要在网上查证了才能写(比较JavaFX是如何诞生,如何从F3变成 JavaFX的)。今天要写的主要是:1、JavaFX的前世今生;(了解了它的历史也就了解了它是什么,它的发展方向,呵呵)2、如何拥有 JavaFX;(知道从哪里去下载开发工具,如何配置它)3、Hello JavaFX World(当然,一个经典的Hello World是不能少的)
阅读全文
首先声明,本文作者信手乱写,以前候捷写
无责任书评,无责任这三个字,在我这儿也差不多——西门町学士 (注)
前两天逛书店,看到一本《
精通NetBeans——Java桌面、Web、企业级程序开发》 ,遂在书店里站了一个多小时(好厚啊!书厚脸皮也厚),基本把这本书看了一遍,整体感觉失望,内容完全配不上
精通NetBeans这个标题。基本上就是在NetBeans环境里写一些很简单的JavaSE和JavaEE代码,而且代码质量也很不高。像Web部分,为了图简单,在JSP页面中写了大量的scriptlet,很不推荐开发人员看这种代码。这本书勉勉强强可以起名叫《
初涉NetBeans》,看来要想更好地推介NetBeans,还需要更多的技术作者的努力。什么时候NetBeans的书能跟Delphi的书媲美了,估计NetBeans的大业差不多就定了吧,呵呵
不管用什么IDE,关键是看开发人员本人对语言和框架的功力,这里也推介两本书,都是老书了,但内容基本不落伍,提升功力更是不错。
一本是:Swing,Matthew Robinson 和 Pavel Vorobiev合写的,学士手上的很老了,上个世纪末的英文原版,但是真的非常非常经典,国内应该有更新的中文版的,做Swing的一定要看,很不错。
一
本关于JSP和Servlet方面的,学士是从TSS下载的免费电子版,Servlets and JavaServer Pages, The
J2EE technology Web Tier,Jayson Falkner 与 Kevin
Jones合著,(基于J2EE4,无JSF方面内容),国内好像没有中文版的。这也是一本好书,Java Web入门与提升均应多读此书。
这两本书最大的特点就是,呵呵,用侯捷的话说,叫
深入浅出。在讲一个技术的同时,也讲正确的编码和设计方法,既能让一个新手从正门登堂入室,也能让一个有经验的开发人员获得提升,以此大力推介之。
文:西门町学士
Eclipse的阵营一向强大,最近又加入了一家重量级的公司:Google,相形之下,NetBeans的阵营显得有点那么“势单力薄”。
我本人则由于对Swing的喜爱及对SWT的不喜爱,一直(从NB3.0以来)使用NetBeans。
(以前的NetBeans确实不够好用,建个Project还得先mount一下,典型的Unix思维)双方这几年的发展,从架构和功能上来说,现在NetBeans和Eclipse已经是大同小异,没有谁比谁牛×。对于developers,用谁凭喜好。
可
对于想通过这两个平台来赚钱的企业来说,二者的区别可就太大了。看看Eclipse的阵营(双方的家长就不提了):BEA, Borland,
Intel, Sybase, Adobe, Oracle, Google,
etc全是些IT届NB哄哄的大牛;再看看NetBeans的部队:一队的无名小卒,大名鼎鼎的也有:Amazon:卖书的;eBay:做生意的;HP:
卖PC的;还有卖手机的,做开源的,不一而足,感觉有点歪瓜裂枣似的。我就纳闷儿了:同样都是做Java IDE
的,受到的待遇区别咋就这么大呢!何况像Borland这样的本来JBuilder和NetBeans就很相近,为什么还得绕个弯儿去舔SWT的屁股?
(李維还在信心满满的说什么
Java開發王者,反正我是不信
)
今
儿个感觉有点想明白了:Eclipse是搭个基本架子,剩下的这些公司在上面做自己的东东然后就可以拿去卖钱了,像MyEclipse、Borland都
是这么个想法;而NetBeans呢,Sun好像是把它定位成送给Developers的礼物(那里面装的当然就会是Sun所领导的Java技术,而不会
是那个觊觎者IBM的Java技术),IDE free, Web pack free, mobility pack free,
Enterprise pack free,
等等等等通通free,免费大赠送,咱们开发者当然是高兴了,既不要钱,又是最新技术,还有个Sun盖的“正统”大章。可对于那些公司就不一样了,老子吃
的就是这碗饭,你全送人了我喝西北风啊?还活不活啊我?你以为我像JBoss那样傻,不卖产品卖服务?JBoss不就是发现这碗饭不好吃才把
Rickard
Oberg这个顽固不化的家伙给踹出门的吗。所以这些公司才纷纷对NetBeans离的远远的,像见了娘亲一向扑向Eclipse的怀抱~~
不管怎么说,我还是Swing的坚定支持者,支持Sun,支持NetBeans,最后,感谢James Golsing,感谢Groove Coverage(我是边听God is A Girl一边码字儿的),感谢你的眼睛不辞辛劳地看到这里!
假如我们要精确计算一个很大的数,比如说,256的阶乘(结果有500多位),怎么办?
你会说,很好办啊,从JDK 1.1起Java不是提供了一个java.math.BigInteger吗?不错,用BigInteger确实能解决问题。不过,如果没有Sun给的这个class,仅仅靠Java最基本的那些类型,我们有没有办法来进行计算呢?答案是,肯定是能嘛,要不然在BigInteger之前怎么办。
方法之一就是用数组来表示。比如说:
int[] data = new int[100];
我们知道,一个int的最大值为2^31-1即2147483647(10位),如果我们把这100个int值串起来,我们就能表示一个1000位的数。这里我们就用这种方式来计算256的阶乘(256!)。
我们先分配100个int的数组,由于是static,所以每个int的初始值都是0。
然后每个int表示6位数,即最大值为999999。因为我们要做乘法,如果给int的位数过大,如9位,那么999999999乘上一个数,如100,它的值就大于了int的max值,造成溢出。所以int表示的位数需要根据需要仔细选择。(用long来表示也同样需要仔细权衡位数)
再定义一个num来表示我们占用的数组的int个数
在乘法的时候,对每个占用的int中的数都要乘,然后一个一个地判断每个int中的值是不是超出了6位:
if (data[j]) > 1000000)
如果超出了则需要进位:
data[k+1] += data[k]/1000000;
data[k] %= 1000000;
一个个判断,最后,如果最高位(即data[num])中的数值也超过了6位,我们就需要占用一个新的int,同样地进位,当然也不要忘了给num加一。
if (data[num] > 1000000) num++;
最后,将我们的数组顺序输出即可。在输出的时候需要小心的是,如果int中的值小于6位,如25,别忘了补上0,即000025,否则你会得到错误的答案的。
完整的代码如下:
package tmp;
/**
*
* @author Stevech
*/
public class BigNumbers {
static int[] data = new int[100];
/** Creates a new instance of BigNumers */
public static void main(String[] args) {
int num = 0; // 占用的个数
data[0] = 1; // 0和1的阶乘是1
for (int i = 2; i < 257; i++) {
for (int j = 0; j < num + 1; j++) {
data[j] *= i; // 对每个int中的数都乘上 i
}
for (int j = 0; j < num + 1; j++) {
if (data[j] > 1000000) {
for (int k = j; k < num + 1; k++) {
if (data[num] > 1000000) num++;
data[k+1] += data[k]/1000000; // 进位
data[k] %= 1000000; // 进位后的余数
}
}
}
}
System.out.println("占用的int数:" + (num+1) + "\n值:");
System.out.print(data[num]);
for (int i = num-1; i > -1; i--) {
System.out.print(new java.text.DecimalFormat("000000").format(data[i]));
}
}
}
输出结果为:
占用的int数:85
值:
85781777534284265411908227168123262515778152027948561985965565037726945255314
75893774402913604514084503758853423365843061571968346936964753222892884974260256
79637332563368786442675207626794560187968867971521143307702077526646451464709187
32610083287632570281898077367178145417025052301860849531906813825748107025281755
94594769870346657127381392862052347568082188607012036110831520935019474371091017
26968262861606263662435022840944191408424615936000000000000000000000000000000000
000000000000000000000000000000