2014年6月29日 星期日

Deploy JavaFX in Google Sites

由於學校名稱將於2014年8月1日更名為國立臺北商業大學,原有的教學網站可能不再使用,因此這幾天陸續將網站內容移至Google Sites,但立刻遇到一個問題,就是如何將JavaFX、Java、Shockwave Flash等範例放在Google Sites,主要是因為Google Sites並不允許將這些內容直接嵌入。

首先是Shockwave Flash,可透過Google內建的Embed Gadget小工具將Shockwave Flash的HTML內容,以Embedding Snippet的方式嵌入至Google Sites,例如:
<embed xmlns="http://www.w3.org/1999/xhtml"
  pluginspage="http://get.adobe.com/tw/flashplayer/" 
  src="https://sites.google.com/site/leohkkimo/swf19A1.swf" 
  width="785" height="460">
</embed>
範例請參考https://sites.google.com/site/leohkkimo/demo/business-intelligence

接著是Java Applet,同樣可透過Google內建的Embed Gadget小工具將Java Applet的HTML內容,以Embedding Snippet的方式嵌入至Google Sites,例如:
<applet name="Reversi" code="Reversi.class" archive="Reversi.jar"
  codebase="https://sites.google.com/site/leohkkimo/" 
  width="400" height="400">
  <param name = "disc1" value = "black.jpg">
  <param name = "disc2" value = "red.jpg">
  <param name = "name1" value = "Black">
  <param name = "name2" value = "Red">
</applet>
範例請參考https://sites.google.com/site/leohkkimo/demo/java-game

但最困難的是JavaFX,由於JavaFX 2.0之後,為支援「Write Once, Deploy Anywhere」的概念,可同時以Java Applet、Java Web Start與視窗應用程式的形式執行,因此其Deployment的方式與一般的Java Applet不同,請參考JavaFX說明,目前Google並沒有內建的Gadget小工具支援JavaFX,因此必須自行開發。

在參考網路上有關Deploy JavaFX in Google Sites的文章之後,經過多次嘗試,終於開發出Google Gadget小工具,並將JavaFX Applet放在Google Sites上,相當興奮。

範例請參考

JavaFX 3D: https://sites.google.com/site/leohkkimo/demo/javafx-3d
JavaFX Game: https://sites.google.com/site/leohkkimo/demo/javafx-game

© Chia-Hui Huang

2014年6月13日 星期五

【JDK8】迎接 JavaFX 8 (1)

今天刊登於CodeData網站,有關JavaFX 8與JavaFX 2之比較,以作為【JDK8】系列文章之一:

http://www.codedata.com.tw/java/jdk8-javafx8-1/

還有在JavaFX Coummunity上輪播。
© Chia-Hui Huang

2014年6月11日 星期三

JavaFX遊戲程式設計

2014年第五本新書,我的第39本書 –「JavaFX遊戲程式設計」。

章節包括:

1. JavaFX
2. 事件
3. 繪圖
4. 特殊效果
5. 動畫
6. 井字遊戲(Tic Tac Toe)
7. 拼圖(Puzzle)
8. 曲棍球(Hockey)
9. 孔明棋(Peg Solitaire)
10. 黑白棋(Reversi)
11. 西洋跳棋(Checker)
12. 翻翻樂(Matching Card)
13. 新接龍(Free Cell)
14. 俄羅斯方塊(Tetris)
15. 踩地雷(Mine Sweeper)
16. 數獨(Sudoku)

附錄:Java Web Start

© Chia-Hui Huang

2014年6月6日 星期五

Visual C++ Web程式設計

2014年第四本新書,我的第38本書 –「Visual C++ Web程式設計」。
© Chia-Hui Huang

2014年6月4日 星期三

JavaFX 8 DatePicker

JavaFX 8新增DatePicker類別,用以選擇日期,使用上相當簡單,當點選DatePicker時,將觸發動作事件 (Action Event),藉由getValue()方法則可取得所選擇的日期,例如:
final DatePicker datepicker = new DatePicker(); 

datepicker.setOnAction(event -> { 
  // 取得所選擇的日期 
  LocalDate date = datepicker.getValue(); 
  System.out.println("選擇的日期為: " + date); 
});
...
【執行結果】
【參考資料】

[1] 黃嘉輝,深入研究JavaFX 2。
[2] Java Official Web Site:http://www.oracle.com/technetwork/java/index.html
[3] JavaFX:http://www.oracle.com/technetwork/java/javafx
[4] JavaFX 8.0 API Specification.
[5] Java Platform, Standard Edition 8 API Specification.

© Chia-Hui Huang

JavaFX 8 Print

使用JavaFX 2開發應用程式,會發現JavaFX 2並沒有提供列印功能,因此欲列印內容,需自訂實作Java AWT的java.awt.print.Printable介面之類別,並實作Printable介面的print()方法,方可處理列印功能。 首先介紹如何實作Java AWT的Printable介面。

當執行列印時,首先以PrinterJob類別的getPrinterJob()方法建立PrinterJob物件,接著以setPrintable()方法顯示列印對話盒,其中setPrintable()方法之參數painterPrintable介面型別,setPrintable()方法並不負責實際的列印動作,實際動作是由傳入之painter物件執行,painter物件需實作Printable介面,例如以下為自訂實作Printable介面之DocToPrinter類別,其中Printable介面的print()方法需被定義:
public class DocToPrinter implements java.awt.print.Printable {
  ... 
  public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
    Graphics2D g2d = (Graphics2D) g; 
    ... 
  } 
  ... 
}
程式中以PageFormatgetImageableX()getImageableY()方法取得版面可列印範圍的左上角座標,並利用java.awt.Graphics2Dtranslate()方法將所要列印的位置移到列印頁面的左上角:
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
g2d.setClip(
  (int)(pageFormat.getImageableX()/scale), 
  (int)(pageFormat.getImageableY()/scale), 
  (int)(pageFormat.getImageableWidth()/scale), 
  (int)(pageFormat.getImageableHeight()/scale)); 
... 
g2d.translate(g2d.getClipBounds().getX(), g2d.getClipBounds().getY()); 
【執行結果】

下圖為列印的執行結果,將開啟列印對話盒:
至於版面設定,首先以PrinterJob類別的getPrinterJob()方法建立PrinterJob物件,待建立之後則以pageDialog()方法顯示版面設定對話盒:
try { 
  PrinterJob prnJob = PrinterJob.getPrinterJob(); 
  // 顯示版面設定對話盒以設定邊界、列印方向、紙張大小、紙張來源、印表機等 
  pf = prnJob.pageDialog(prnJob.defaultPage()) ; 
} 
catch (Exception ex) {...} 
【執行結果】

下圖為版面設定之執行結果,此為作業系統之版面設定對話盒: 
但由於上述實作Printable介面的方式稍為複雜,因此Java SE 6.0新增列印功能,僅需以Java Swing的JTextComponent抽象類別之print()方法處理,相當簡單,例如:
try { 
  // 列印內容 
  jtextarea.print(); 
} 
catch (PrinterException ex) {...} 
【執行結果】

此方法將顯示Java樣式的列印對話盒,如下圖所示,有別於上述的列印對話盒,此外列印的格式亦不同,請比較兩者間之差異: 
有了上述的瞭解之後,接著說明JavaFX 8新增的列印功能。

JavaFX 8新增PrinterPrinterJob類別,類似於Java AWT的PrinterJob類別,但不似Java AWT般複雜。當執行列印時,首先以Printer類別的getDefaultPrinter()方法取得作業系統預設的印表機,接著以createPageLayout()方法設定版面配置,如紙張大小 (A4NA_LETTER)、列印方向 (LANDSCAPEPORTRAIT)、上下左右邊界等,例如:
Printer printer = Printer.getDefaultPrinter(); 
// 分別設定A4紙張、直垂列印方向、預設邊界 
PageLayout pageLayout = printer.createPageLayout( 
  Paper.A4, PageOrientation.PORTRAIT, Printer.MarginType.DEFAULT);
接著以PrinterJob類別的createPrinterJob()方法建立PrinterJob物件,以作為列印序列 (Queue) 之用,並以PrinterJob類別的printPage()方法列印,當列印完成時,則以PrinterJob類別的endJob()方法結束列印序列,例如:
PrinterJob job = PrinterJob.createPrinterJob(); 

if (job != null) { 
  boolean success = job.printPage(node); 

  if (success) { 
    job.endJob(); 
  } 
} 
【參考資料】

[1] 黃嘉輝,深入研究JavaFX 2。
[2] 黃嘉輝,
深入研究Java Swing。
[3] Java Official Web Site:http://www.oracle.com/technetwork/java/index.html
[4] JavaFX:http://www.oracle.com/technetwork/java/javafx
[5] JavaFX 8.0 API Specification.
[6] Java Platform, Standard Edition 8 API Specification.

© Chia-Hui Huang