Just Java IT

          西門町學士關于Java的隨便一說而已……

          2006年4月9日 #

          走進JavaFX-(2)

               摘要: 我猶豫了好一陣才決定寫JavaFX的語法部分。個人認為這是學習中最枯燥的部分。因為JavaFX的語法非常簡單且直觀,比如Sun提供的在線 Tutorial的GUI部分,即使你是第一次聽說JavaFX這個東西,只要你稍有一點點編程經驗,你也基本上能夠毫無障礙地理解這個Tutorial 的內容了。
          話雖如此,部分語法可能確實會造成一些理解困難,比如有的地方分隔符用逗號(,)分號(;)和空格都可以,def和var的區別,=>操作符,等等這些還得初看一遍語法才能理解(當然,基本上就沒有必要看第二遍了吧)。因此,我也在此將JavaFX的語法照著Sun的語法 Tutorial快速地過一遍,為以后打下一個堅實(!)的基礎,呵呵。  閱讀全文

          posted @ 2008-12-16 01:05 西門町學士 閱讀(1825) | 評論 (4)編輯 收藏

          走進JavaFX-(1u1)

          /**
          以前寫了一個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
          }

          結果如圖:

          posted @ 2008-12-12 22:42 西門町學士 閱讀(1480) | 評論 (1)編輯 收藏

          走進JavaFX-(1)

               摘要: JavaFX出來已經很長一段時間了。一直在計劃跟進,可是因為比較懶,現在才慢慢地學習。這里就暫做做學習總結的地方吧。
          雖然是總結,我還是打算寫詳細一點。本來我對JavaFX了解也不是很多,有的東西還要在網上查證了才能寫(比較JavaFX是如何誕生,如何從F3變成 JavaFX的)。今天要寫的主要是:1、JavaFX的前世今生;(了解了它的歷史也就了解了它是什么,它的發展方向,呵呵)2、如何擁有 JavaFX;(知道從哪里去下載開發工具,如何配置它)3、Hello JavaFX World(當然,一個經典的Hello World是不能少的)  閱讀全文

          posted @ 2008-07-18 11:12 西門町學士 閱讀(1857) | 評論 (6)編輯 收藏

          NetBeans無好書[順便推薦兩本Java書]

          首先聲明,本文作者信手亂寫,以前候捷寫無責任書評,無責任這三個字,在我這兒也差不多——西門町學士 (注)

          前兩天逛書店,看到一本《精通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入門與提升均應多讀此書。
          這兩本書最大的特點就是,呵呵,用侯捷的話說,叫深入淺出。在講一個技術的同時,也講正確的編碼和設計方法,既能讓一個新手從正門登堂入室,也能讓一個有經驗的開發人員獲得提升,以此大力推介之。

          posted @ 2007-06-10 23:45 西門町學士 閱讀(916) | 評論 (1)編輯 收藏

          又說Eclipse與NetBeans

          文:西門町學士

          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一邊碼字兒的),感謝你的眼睛不辭辛勞地看到這里!

          posted @ 2006-12-15 22:42 西門町學士 閱讀(1157) | 評論 (4)編輯 收藏

          數組的力量

          ??? 假如我們要精確計算一個很大的數,比如說,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

          posted @ 2006-04-16 21:19 西門町學士 閱讀(1956) | 評論 (3)編輯 收藏

          JTextField內容有效性驗證幾種方式

          在使用 SwingJTextField時,我們常常希望只接受那些符合我們要求的錄入,如數字、電話號碼、郵政編碼、E-mail等。JFC工作組在這方面也做了很多工作,每一次新的Java Se發布,往往都提供了新的、更方便和強大的有效性驗證方式,在這里列舉幾種不同的驗證方式。

          • 利用鍵盤和焦點事件

          這是最直覺的方式。利用 KeyListener來選擇允許的字符,且添加FocusListener,使得

          內容不符合要求時不允許焦點轉移。這種方式很繁瑣, Sun的建議是不推薦使用這種方式。

          • 使用自定義的 Document

          我們知道, Swing組件是基于MVC實現的。JTextComponentModel是一個叫做DocumentInterface,我們可以通過限制Document的內容來達到有效性驗證的目的。javax.swing.text包中有多個不同的Document的實現,JTextField使用的是PlainDocument。如果我們希望JTextField只接受數字,可以實現我們特定的Document并使之替換默認的Document


             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;
          }
          }
          }

          然后用 IntegerDocument去替換JTextField默認的Document

             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);
          }
          }

          代碼很簡單,一目了然。這里說點題外話, Sun建議的Swing Applicationmain函數寫法如上所示:先建一個Runnable,然后把這個Runnable放到event-dispatch thread中去執行。另外,以前有的Developer(比如我)喜歡用SwingUtilities.invokeLater(runner)來將一個thread放到event-dispatch thread中,現在Sun也建議用EventQueue.invokeLater(runner),因為SwingUtilities方法版本僅僅是對EventQueue方法版本的一個包裝。

          • InputVerifier來實現

          J2SE 1.3中加入了一個名為InputVerifier的抽象類,可用于任何JComponent。其中定義了boolean verifiy(JComponent input)方法。如果組件中的文本是有效的,當焦點轉移時(如按下TabShift-Tab),verify方法返回true;否則返回false,使得焦點仍停留在當前組件上。我們仍以數字為例:

             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);
          }
          }

          這個例子的效果和上一個是不同的。自定義 DocumentApp中,用戶將會發現任何非數字的字符都不會在JTextField中出現;而在使用InputVerifierApp中,用戶在錄入字符時不會發現任何異常,但是當他確認錄入完成后,如果內容不符合有效性,焦點將不會轉移!這兩種情況都可能讓一個沒有經驗的用戶茫然,具體使用哪一種是一個見仁見智的問題。

          • 使用 Document Filter

          J2SE 1.4中,又加入了一個新的類:DocumentFilter。你無需再實現一個新的Document,而是對現有的Document過濾一遍。它的結果與實現自定義的Document并無二樣,僅僅是思路不同而已。

             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;
          }
          }

          再將這個 Filter應用于Document

             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中的與text有關的組件(而InputVerifier可用于任何組件)。除了這幾種方法,在對于TextField而言,我們還有JFormattedTextField,很多時候用JFormattedTextField將是非常容易和簡單的方式。

          注:這篇文章基本根據SDN的Core Java Tech Tips意譯而來,代碼基本跟其一致,另外還參考了M. Robinson & P. Vorobiev的Swing, Chapter 11

          posted @ 2006-04-09 16:26 西門町學士 閱讀(2370) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 监利县| 晋宁县| 永济市| 泰兴市| 宜城市| 文成县| 南岸区| 石河子市| 汨罗市| 罗甸县| 陵水| 江阴市| 长泰县| 富宁县| 尼玛县| 札达县| 仪陇县| 崇州市| 丘北县| 枣庄市| 五寨县| 昆明市| 大洼县| 贡嘎县| 永泰县| 白银市| 晋江市| 扎囊县| 双流县| 澳门| 甘洛县| 晴隆县| 旌德县| 高清| 乐至县| 汾西县| 铅山县| 什邡市| 通辽市| 吉水县| 汕尾市|