??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
08
q?2?日,Sun正式发布了JavaFX1.0。JavaFX在演q过E中发生了很多的变化Q因此,我以前写的JavaFX的第一?
HelloWorld的例子已l无法在正式版下q行Q于是在q里重写那个例子。而新的API我也q没有开始学?fn),只好大略地浏览了一遍APIp草写,
因此Q这个例子虽然在1.0版下正确q行Q却未必是最适合的写法,以后如发现问题再来update2吧,呵呵……
正式版中很多包的命名有了天翻
地覆的变化,class的位|和名称很多也面目全非。比如GUIq块q历了由javafx.ui变化成javafx.gui再变化成
javafx.scene和javafx.application再进化成javafx.scene和javafx.stageQ而跟Swing相关的组
件也l统加上了Swing前缀。有的class我已l找不到了,比如以前的javafx.ui.MessageDialogQ我?.0中没有找到对应的
classQ只好直接叫用javax.swing.JOptionPane了。好了,废话不说了,贴新代码如下Q?br />
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
}
l果如图Q?br />
]]>
]]>
前两天逛书店,看到一本?font size="-1">_NNetBeans——Java桌面、Web、企业E序开?/font>?Q遂在书店里站了一个多时Q好厚啊Q书厚脸皮也厚)Q基本把q本书看了一遍,整体感觉失望Q内容完全配不上_NNetBeansq个标题。基本上是在NetBeans环境里写一些很单的JavaSE和JavaEE代码Q而且代码质量也很不高。像Web部分Qؓ了图单,在JSP面中写了大量的scriptletQ很不推荐开发h员看q种代码。这本书勉勉强强可以起名叫?font size="-1">初涉NetBeans》,看来要想更好地推介NetBeansQ还需要更多的技术作者的努力。什么时候NetBeans的书能跟Delphi的书媲美了,估计NetBeans的大业差不多定了吧Q呵?br>不管用什么IDEQ关键是看开发h员本人对语言和框架的功力Q这里也推介两本书,都是老书了,但内容基本不落伍Q提升功力更是不错?br>一本是:SwingQMatthew Robinson ?Pavel Vorobiev合写的,学士手上的很老了Q上个世U末的英文原版,但是真的非常非常l典Q国内应该有更新的中文版的,做Swing的一定要看,很不错?br>一
本关于JSP和Servlet斚w的,学士是从TSS下蝲的免费电(sh)子版QServlets and JavaServer Pages, The
J2EE technology Web TierQJayson Falkner ?Kevin
Jones合著Q(ZJ2EE4Q无JSF斚w内容Q,国内好像没有中文版的。这也是一本好书,Java Web入门与提升均应多L书?br>q两本书最大的特点是Q呵呵,用侯L(fng)话说Q叫深入出。在讲一个技术的同时Q也讲正的~码和设计方法,既能让一个新手从正门d入室Q也能让一个有l验的开发h员获得提升,以此大力推介之?img src ="http://www.aygfsteel.com/stevech/aggbug/123268.html" width = "1" height = "1" />
]]>
Eclipse的阵营一向强大,最q又加入了一安量的公司:GoogleQ相形之下,NetBeans的阵营显得有炚w么“势单力薄”?br />我本人则׃对Swing的喜爱及对SWT的不喜爱Q一_从NB3.0以来Q用NetBeans?br />Q以前的NetBeans实不够好用Q徏个Projectq得先mount一下,典型的Unix思维Q双方这几年的发展,从架构和功能上来_现在NetBeans和Eclipse已经是大同小异,没有谁比谁牛×。对于developersQ用谁凭喜好?br />?
对于想通过q两个^台来赚钱的企业来_二者的区别可就太大了。看看Eclipse的阵营(双方的家长就不提了)QBEA, Borland,
Intel, Sybase, Adobe, Oracle, Google,
etc全是些IT届NB哄哄的大牛;再看看NetBeans的部队:一队的无名卒Q大名鼎鼎的也有QAmazonQ卖书的QeBayQ做生意的;HPQ?
卖PC的;q有卖手机的Q做开源的Q不一而Q感觉有Ҏ(gu)瓜裂枣似的。我q闷儿了:同样都是做Java IDE
的,受到的待遇区别咋p么大呢!何况像Borlandq样的本来JBuilder和NetBeans很相近Qؓ什么还得绕个弯儿去舔SWT的屁股?
Q李E还在信心满满的说什?span style="font-weight: bold;">Java開發王?/span>Q反正我是不?img alt="" src="http://blog.csdn.net/Editor/FCKeditor/editor/images/smiley/msn/thumbs_down.gif" />Q?br />?
儿个感觉有点x白了QEclipse是搭个基本架子,剩下的这些公司在上面做自q东东然后可以拿d׃Q像MyEclipse、Borland?
是这么个xQ而NetBeans呢,Sun好像是把它定位成送给Developers的礼物(那里面装的当然就会是Sun所领导的Java技术,而不?
是那个觊觎者IBM的Java技术)QIDE free, Web pack free, mobility pack free,
Enterprise pack free,
{等{等通通freeQ免费大赠送,׃开发者当然是高兴了,既不要钱Q又是最新技术,q有个Sun盖的“正l”大章。可对于那些公司׃一样了Q老子?
的就是这饭Q你全送h了我喝西北风啊?q活不活啊我Q你以ؓ我像JBoss那样傻,不卖产品卖服务?JBoss不就是发现这饭不好吃才?
Rickard
Obergq个固不化的家伙给t出门的吗。所以这些公司才UL(fng)对NetBeansȝq远的,像见了娘亲一向扑向Eclipse的怀抱~~
不管怎么_我还是Swing的坚定支持者,支持SunQ支持NetBeansQ最后,感谢James GolsingQ感谢Groove CoverageQ我是边听God is A Girl一边码字儿的)Q感谢你的眼睛不辞辛力_看到q里Q?img src ="http://www.aygfsteel.com/stevech/aggbug/88064.html" width = "1" height = "1" />
]]>
我们知道Q一个int的最大gؓ2^31-1?147483647Q?0位)Q如果我们把q?00个intghQ我们就能表CZ?000位的数。这里我们就用这U方式来计算256的阶乘(256!Q?br /> 我们先分?00个int的数l,׃是staticQ所以每个int的初始值都??br /> 然后每个int表示6位数Q即最大gؓ999999。因为我们要做乘法,如果lint的位数过大,?位,那么999999999乘上一个数Q如100Q它的值就大于了int的max|造成溢出。所以int表示的位数需要根据需要仔l选择。(用long来表CZ同样需要仔l权衡位敎ͼ
再定义一个num来表C我们占用的数组的int个数
在乘法的时候,Ҏ(gu)个占用的int中的数都要乘Q然后一个一个地判断每个int中的值是不是出?位:
if (data[j]) > 1000000)
如果出了则需要进位:
data[k+1] += data[k]/1000000;
data[k] %= 1000000;
一个个判断Q最后,如果最高位Q即data[num]Q中的数g过?位,我们需要占用一个新的intQ同样地q位Q当然也不要忘了lnum加一?br /> if (data[num] > 1000000) num++;
最后,我们的数组序输出卛_。在输出的时候需要小心的是,如果int中的值小?位,?5Q别忘了补上0Q即000025Q否则你会得到错误的{案的?br /> 完整的代码如下:
/**
*
* @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; // 占用的个?/span>
data[0] = 1; // 0?的阶乘是1
for (int i = 2; i < 257; i++) {
for (int j = 0; j < num + 1; j++) {
data[j] *= i; // Ҏ(gu)个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; // q位
data[k] %= 1000000; // q位后的余数
}
}
}
}
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
]]>
利用键盘和焦点事?/span>
q是最直觉的方式。利?/span> KeyListener来选择允许的字W,且添?/span>FocusListenerQ?/span>
内容不符合要求时不允许焦点{UR这U方式很J琐Q?/span> Sun的徏议是不推荐用这U方式?/span>
使用自定义的 Document
我们知道Q?/span> Swinglg是基?/span>MVC实现的?/span>JTextComponent?/span>Model是一个叫?/span>Document?/span>InterfaceQ我们可以通过限制Document的内Ҏ(gu)辑ֈ有效性验证的目的?/span>javax.swing.text包中有多个不同的Document的实玎ͼJTextField使用的是PlainDocument。如果我们希?/span>JTextField只接受数字,可以实现我们特定?/span>Documentq之替换默认的DocumentQ?/span>
package sdn;
import javax.swing.text.*;
public class IntegerDocument extends PlainDocument {
int currentValue = 0;
public int getValue() {
return currentValue;
}
public void insertString(int offset, String string,
AttributeSet attributes) throws BadLocationException {
if (string == null) {
return;
} else {
String newValue;
int length = getLength();
if (length == 0) {
newValue = string;
} else {
String currentContent = getText(0, length);
StringBuffer currentBuffer =
new StringBuffer(currentContent);
currentBuffer.insert(offset, string);
newValue = currentBuffer.toString();
}
currentValue = checkInput(newValue, offset);
super.insertString(offset, string, attributes);
}
}
public void remove(int offset, int length)
throws BadLocationException {
int currentLength = getLength();
String currentContent = getText(0, currentLength);
String before = currentContent.substring(0, offset);
String after = currentContent.substring(length+offset,
currentLength);
String newValue = before + after;
currentValue = checkInput(newValue, offset);
super.remove(offset, length);
}
public int checkInput(String proposedValue, int offset)
throws BadLocationException {
if (proposedValue.length() > 0) {
try {
int newValue = Integer.parseInt(proposedValue);
return newValue;
} catch (NumberFormatException e) {
throw new BadLocationException(proposedValue, offset);
}
} else {
return 0;
}
}
}
然后?/span> IntegerDocumentL?/span>JTextField默认?/span>DocumentQ?/span>
package sdn;
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
public class NumericInput {
public static void main(String args[]) {
Runnable runner = new Runnable() {
public void run() {
JFrame frame = new JFrame("Numeric Input");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(2, 2));
frame.add(new JLabel("Number"));
JTextField fieldOne = new JTextField();
Document doc= new IntegerDocument();
fieldOne.setDocument(doc);
frame.add(fieldOne);
frame.add(new JLabel("All"));
JTextField fieldTwo = new JTextField();
frame.add(fieldTwo);
frame.setSize(250, 90);
frame.setVisible(true);
}
};
EventQueue.invokeLater(runner);
}
}
代码很简单,一目了然。这里说炚w外话Q?/span> Sun?/span>Swing Application?/span>main函数写法如上所C:先徏一?/span>RunnableQ然后把q个Runnable攑ֈevent-dispatch thread中去执行。另外,以前有的DeveloperQ比如我Q喜Ƣ用SwingUtilities.invokeLater(runner)来将一?/span>thread攑ֈevent-dispatch thread中,现在Sun也徏议用EventQueue.invokeLater(runner)Q因?/span>SwingUtilitiesҎ(gu)版本仅仅是对EventQueueҎ(gu)版本的一个包装?/span>
?/span> InputVerifier来实?/span>
?/span> J2SE 1.3中加入了一个名?/span>InputVerifier的抽象类Q可用于MJComponent。其中定义了boolean verifiy(JComponent input)Ҏ(gu)。如果组件中的文本是有效的,当焦点{ULQ如按下Tab?/span>Shift-TabQ,verifyҎ(gu)q回trueQ否则返?/span>falseQ得焦点仍停留在当前组件上。我们仍以数字ؓ例:
package sdn;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class NumericVerifier{
public static void main(String args[]) {
Runnable runner = new Runnable() {
public void run() {
JFrame frame = new JFrame("Numeric Verifier");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel1 = new JPanel(new BorderLayout());
JLabel label1 = new JLabel("Numeric-only");
JTextField textField1 = new JTextField();
panel1.add(label1, BorderLayout.WEST);
panel1.add(textField1, BorderLayout.CENTER);
JPanel panel2 = new JPanel(new BorderLayout());
JLabel label2 = new JLabel("Anything");
JTextField textField2 = new JTextField();
panel2.add(label2, BorderLayout.WEST);
panel2.add(textField2, BorderLayout.CENTER);
JPanel panel3 = new JPanel(new BorderLayout());
JLabel label3 = new JLabel("Numeric-only");
JTextField textField3 = new JTextField();
panel3.add(label3, BorderLayout.WEST);
panel3.add(textField3, BorderLayout.CENTER);
InputVerifier verifier = new InputVerifier() {
public boolean verify(JComponent comp) {
boolean returnValue;
JTextField textField = (JTextField)comp;
try {
Integer.parseInt(textField.getText());
returnValue = true;
} catch (NumberFormatException e) {
Toolkit.getDefaultToolkit().beep();
returnValue = false;
}
return returnValue;
}
};
textField1.setInputVerifier(verifier);
textField3.setInputVerifier(verifier);
frame.add(panel1, BorderLayout.NORTH);
frame.add(panel2, BorderLayout.CENTER);
frame.add(panel3, BorderLayout.SOUTH);
frame.setSize(300, 95);
frame.setVisible(true);
}
};
EventQueue.invokeLater(runner);
}
}
q个例子的效果和上一个是不同的。自定义 Document?/span>App中,用户会发现M非数字的字符都不会在JTextField中出玎ͼ而在使用InputVerifier?/span>App中,用户在录入字W时不会发现M异常Q但是当他确认录入完成后Q如果内容不W合有效性,焦点不会{U!q两U情况都可能让一个没有经验的用户茫然Q具体用哪一U是一个见仁见智的问题?/span>
使用 Document Filter
?/span> J2SE 1.4中,又加入了一个新的类Q?/span>DocumentFilter。你无需再实C个新?/span>DocumentQ而是对现有的Documentqo一遍。它的结果与实现自定义的Documentq无二样Q仅仅是思\不同而已?/span>
package snd;
import javax.swing.text.*;
import java.awt.Toolkit;
public class IntegerDocumentFilter extends DocumentFilter {
int currentValue = 0;
public IntegerDocumentFilter() {
}
public void insertString(DocumentFilter.FilterBypass fb,
int offset, String string, AttributeSet attr)
throws BadLocationException {
if (string == null) {
return;
} else {
replace(fb, offset, 0, string, attr);
}
}
public void remove(DocumentFilter.FilterBypass fb,
int offset, int length)
throws BadLocationException {
replace(fb, offset, length, "", null);
}
public void replace(DocumentFilter.FilterBypass fb,
int offset, int length, String text, AttributeSet attrs)
throws BadLocationException {
Document doc = fb.getDocument();
int currentLength = doc.getLength();
String currentContent = doc.getText(0, currentLength);
String before = currentContent.substring(0, offset);
String after = currentContent.substring(
length+offset, currentLength);
String newValue = before +
(text == null ? "" : text) + after;
currentValue = checkInput(newValue, offset);
fb.replace(offset, length, text, attrs);
}
private int checkInput(String proposedValue, int offset)
throws BadLocationException {
int newValue = 0;
if (proposedValue.length() > 0) {
try {
newValue = Integer.parseInt(proposedValue);
} catch (NumberFormatException e) {
throw new BadLocationException(
proposedValue, offset);
}
}
return newValue;
}
}
再将q个 Filter应用?/span>DocumentQ?/span>
package sdn;
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
public class NumericInputFilter {
public static void main(String args[]) {
Runnable runner = new Runnable() {
public void run() {
JFrame frame = new JFrame("Numeric Input Filter");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(2, 2));
frame.add(new JLabel("Number"));
JTextField textFieldOne = new JTextField();
Document doc= textFieldOne.getDocument();
DocumentFilter filterOne = new IntegerDocumentFilter();
((AbstractDocument)doc).setDocumentFilter(filterOne);
textFieldOne.setDocument(doc);
frame.add(textFieldOne);
frame.add(new JLabel("All"));
JTextField textFieldTwo = new JTextField();
frame.add(textFieldTwo);
frame.setSize(250, 90);
frame.setVisible(true);
}
};
EventQueue.invokeLater(runner);
}
}
DocumentFilter只能用于Swing中的?/span>text有关的组Ӟ?/span>InputVerifier可用于Q何组Ӟ。除了这几种Ҏ(gu)Q在对于TextField而言Q我们还?/span>JFormattedTextFieldQ很多时候用JFormattedTextField是非常Ҏ(gu)和简单的方式?/span>
注:q篇文章基本Ҏ(gu)SDN的Core Java Tech Tips意译而来Q代码基本跟其一_另外q参考了M. Robinson & P. Vorobiev的Swing, Chapter 11
int
s are equal. But this time the int
s
point to different objects. What you have discovered is that for small
integral values, the objects are cached in a pool much like Strings.
When i
and j
are 2, a single object is referenced from two different locations. When i
and j
are 2000, two separate objects are referenced. Autoboxing is guaranteed
to return the same object for integral values in the range [-128, 127],
but an implementation may, at its discretion, cache values outside of
that range. It would be bad style to rely on this caching in your code.