Thursday, 11 November 2010

JavaFX cơ bản và phát triển

Xin chào một công nghệ mới trên nền tảng Java.

JavaFX là một scripting trên nền Java tập trung vào giao diện đồ họa. Cái nôi tiền thân của nó là F3, một giải pháp giao diện hỗ trợ các công nghệ hiện hành như Flash hay SVG,... bạn đã có những ứng dụng được phát triển bằng Flash hay SVG rồi thì F3 sẽ chạy được chúng với đồ họa như của Swing. Nói thẳng, nó là Swing, JavaFX cũng vậy, chỉ là một cách thức để con người ta viết code nhanh hơn thôi. Scripting đã thể hiện được năng lực xuất xắc trong giao diện đồ họa ứng dụng. Đơn giản, nhanh, dễ tinh chỉnh, dĩ nhiên với những cài đặt lớn và phức tạp thì scripting không thể lựa chọn được.

Trước hết JavaFX là một ngôn ngữ, điều đó nhắc nhở rằng nó có cú pháp thể hiện của nó, bắt buộc bạn phải tuân thủ. Chẳng hạn nếu trong java chúng ta khai báo biến như sau : String a = “nhuthuan.blogspot.com” thì với JavaFX, chúng ta có kiểu khai báo như sau : var a = “nhuthuan.blogspot.com”. Bạn hãy xem đoạn code dưới đây :

Code: Chọn hết
var x = [“thuan”, “viet”, “linh tinh”];
insert “vao day” into x; // sẽ thành [“thuan”, “viet”, “linh tinh”, “vào đây”]


Hoặc :

Code: Chọn hết
select n*n from n in [1..10]


Nhìn qua thì bạn thấy quen quen đúng không, có select và insert into đã không còn lạ lầm từ SQL Scripting languague hay [1..10] từ Groovy hoặc Ruby. Bảo là JavaFX là một scripting languege mà. Nếu xét về mặt logic thì JavaFX có ngữ pháp rất gần với các scripting thông dụng hiện nay.
Kiểu dữ liệu cũng không quá cầu kỳ và đông đúc, tập trung ở 4 kiểu dữ liệu cơ bản hay sử dụng trong scripting là Integer, Number (chẳc thay cho Double hay Float), Boolean và String (char). Bạn thấy đó, không có byte hoặc những thức kiểu dữ liệu khác, quá đơn giản để thỏa mãn hết những gì bạn cần thể hiện trên giao diện đồ họa. Các biểu thức hoặc toán tử thì đơn giản rồi, chả khác gì Java đâu, y hệt. Thế nhưng với mảng, chúng ta có thêm các toán tử giống như của chuẩn SQL, cũng insert, delete, select, before,... chẳng hạn bạn nhìn qua một đoạn code sau :

Code: Chọn hết
Hocsinh {
ten: "Nhu Dinh Thuan"
email: "nhudinhthuan@yahoo.com"
diem: [20, 60, 45, 55, 34, 68]
};

var hoten = select ten from Hocsinh where email == "nhudinhthuan@yahoo.com"



Hì, cứ như là đang làm việc với cơ sở dữ liệu ấy. Và khi dữ liệu được đẩy từ database ra rồi lưu thành mảng thì chúng ta vô tư viết các câu lệnh SQL. Bạn có thể tham khảo thêm liên kết ở cuối bài để có những cài đặt phức tạp hơn. Các mệnh đề, xử lý vòng lặp cũng giống Java như if – else, while, try-catch,throw exception, ...Tuy nhiên bạn sẽ bắt gặp cú pháp vòng lặp for giống như trong Groovy hoặc các toán từ SQL ngay trong nó, chẳng hạn :

Code: Chọn hết
for (i in [0..10] where i % 2 == 0) {
System.out.println("i = {i}");
}
hoặc :
for (i in [1,3..10]) {
System.out.println("i = {i}");
}


Thú vị không, và còn một một điều ngạc nhiên nữa khi bạn phải làm việc với những mô hình dữ liệu như mảng hai chiều chẳng hạn:

Code: Chọn hết
for (i in [0..10], j in [0..10]) {
System.out.println(i);
System.out.println(j);
}



Đó là scripting grammar, nó gần với đời thường hơn, gọn hơn, dễ sử dụng hơn rất nhiều.



Liên hệ gì với java hay không ?
Có chứ, JavaFX trước tiên với cái tên có tiền tố Java, nó là Java, chúng ta có thể import các thư viện trong java và dùng nó một các bình thường. Chẳng hạn, cú pháp của một đoạn code sau thể hiện điều đó:

Code: Chọn hết
import javafx.ui.*;
import java.net.URL;
import demo.Demos;
import java.lang.System;
import net.java.javafx.typeImpl.F3WebStart;
operation DemoLauncher.startApp(app:DemoApp) {
var baseURL = if app.baseURL == null then new URL("file:") else new URL(app.baseURL);
var args = [app.className, "-classpath", "{select "{new URL(baseURL, p)};" from p in app.classPath}"];
F3WebStart.start1(args, null, null);
}



Như bạn thấy đấy, chúng ta sử dụng lớp URL từ gói java.net.URL, dĩ nhiên không được thoải mái như ở người trong nhà, lớp System từ java.lang bạn cũng phải ... import. Và mọi thứ giống như kiểu muốn dùng thì phải xin phép nhé. Chúng ta có thể tạo đối tượng như trong java, gọi các hàm hay cài đặt interface. Reflection cũng được triển khai một các ngụ ý nhằm tăng cường sự linh hoạt cho scripting này. Chẳng hạn :

Code: Chọn hết
class ABC {
attribute a: Number;
}
var x = new ABC();
System.out.println(x.class.Name);


Kết quả sẽ in ra là ABC, ra chuyện là tên lớp của đối tượng x là ABC. Thấy chưa, nó cũng khá giống Java đấy chứ.
Và nó hướng đối tượng. Vâng chúng ta cũng phải viết class, tạm thời bỏ qua những đặc điểm có tính sách vở như thừa kết hay đa thừa kế, interface, trừu tượng dữ liệu, đa hình,... chúng ta hãy xét đến sự đơn giản của mô hình cài đặt hướng đối tượng. Nghĩa là một đối tượng có thuộc tính (dữ liệu)và chức năng (khả năng xử lý). Hãy xem class sau :

Code: Chọn hết
class Window extends AbstractFrame {

attribute screenx: Number;
operation Window.pack() {
frame.pack();
}
}


Rất hướng đối tượng, phải không, cũng thừa kế như ai và cũng giống gần như các đối tượng định dạng trong HTML là có ... attribute. Tuy nhiên class không có constructor, các thuộc tính cũng không có setter-getter như trong các Java bean. Nói không ngoa, việc cài đặt các setter-getter trong java bean làm tôi mệt đứt đừn và “rối tinh tươm”. Thay vì có setter, JavaFX đưa ra triển khai mới – ý tưởng cũ là triggers giống như trong SQL. Trigger có cú pháp bao gồm phần đầu và phần thân, phần đầu để chỉ rõ trigger đó gắn dữ liệu vào đâu và phần thân là để chỉ rõ gắn cái gì vào. Đọc ví dụ sau là bạn hiểu ngay :

Code: Chọn hết
import java.lang.System;

class X {
attribute nums: Number*;
}

trigger on new X { // gắn dữ liệu vào khi tạo mới đối tượng
insert [3,4] into this.nums; // dữ liệu gắn vào
}

var x = new X();
System.out.println(x.nums == [3,4]); // kết quả in ra là true


Bạn có một vài kiểu trigger là tạo mới, cập nhật, thay thế, lồng dữ liệu vào, xóa...chẳng hạn trigger xóa dữ liệu sẽ viết như sau:

Code: Chọn hết
trigger on delete num from X.nums {
System.out.println("just deleted {num} from X.nums at position {indexof num}");
}


Dĩ nhiên, trong bài viết, chỉ cố gắng dắt ngựa cho bạn ngắm hoa, muốn thuần thục và linh hoạt thì bạn cần phải thực hành nhiều và bổ sung vốn ngữ pháp làm việc với JavaFX bằng các tài liệu chính thống từ Sun.

lúc Thứ sáu, tháng năm 11, 2007 9:35:00 SA, Blogger nhu dinh thuan viết...

Trở lại mục đích chính đẻ Java cố rặn đẻ thêm đứa con này chính là giao diện.
Như đã nói, scripting thể hiện một năng lực xuất xắc trong lĩnh vực GUI cho Application. Do đó, mục đính chính của JavaFX là làm đơn giản hóa quá trình tạo giao diện và cải thiện cả về tốc độ code lẫn tốc độ thực thi ứng dụng. Giao diện đồ họa mà JavaFX thể hiện chính là Swing look and feel. Các component tương ứng cũng giống như trong Swing, chúng ta có Window, Button, Label, Text, ProgressBar, Menu... giống như HTML Tag, các đối tượng đồ họa này hướng nhiều đến FORM hơn là định dạng tài liệu, chúng cũng có attribute như HTML giúp cho việc trang trí màu mè như font, nền, cỡ chữ,... Chẳng hạn, xem một đoạn code đơn giản sau:

Code: Chọn hết
import javafx.ui.*;

Frame {
title: "Hello JavaFX Article"
width: 200
height: 50
content: Label {
text: "hì hì"
}
visible: true
}


Component có thể chứa component. Tuy nhiên, khác với HTML là chúng ta có thể cài các action vào đây. Chẳng hạn đoạn code sau :

Code: Chọn hết
Frame {
content: Button {
text: "Ấn em nào!"
action: operation() {
System.out.println("Ấn nữa đi anh!");
}
}
visible: true
}


Quá tuyệt phải không, nếu muốn cài các action listener trong HTML node chúng ta phải cần đến JavaScript và như vậy thì chúng không đồng nhất và tường minh cho lắm. Chúng ta cũng có những khái niệm về layout hay border, chúng được bê từ Swing sang : GridPanel GridLayout GridBagPanel GridBagLayout FlowPanel FlowLayout BorderPanel BorderLayout Box BoxLayout StackPanel, CardPanel CardLayout GroupPanel . Y hệt nhé, cũng có canvas để bạn vẽ vời hoa lá vào đấy vì nó hoàn toàn hỗ trợ 2D thậm chí là cả 3D nữa. Tôi thì chưa thử tí nào nên cũng khó đánh giá, thấy Sun quảng cáo vậy thì ăn theo nói leo vậy thôi chứ có biết gì đâu.
Một điểm đặc biệt của đặc biệt nữa là JavaFX có hỗ trợ HTML. HTML thì quá thông dụng rồi, ai cũng biết, do đó JAVAFX hỗ trợ HTML không có gì ngạc nhiên cả và nó làm tăng cường tính hấp dẫn của công nghệ này với lập trình viên. Chẳng hạn xem đoạn code sau:

Code: Chọn hết
Frame {
content: Label {
text: bind "

Shopping Cart


}
visible: true
}


Lại còn có thể viết logic code xen lẫn code HTML được nữa chứ, thế mới kêu.
Cuối cùng thì, nói gì nhỉ, vừa có một cái liếc dọc, liếc ngang với một sản phẩm mới là JavaFX của Sun. nói chung đó là một sự đón chào, nó mạnh để cho ta phát triển các ứng dụng có giao diện đồ họa phức tạp. Sun đang có một chiến lược, đó là chiến lược cho một mô hình ứng dụng phát triển với giao diện đồ họa Swing và phân phối qua Internet. Tất cả phải đón chờ sự ra đời của Java 7, khi mà JRE có bản Kernel được phân phối qua net với kích thước trên dưới 3mb. JavaFX được nhận định là đối thủ thách thức Flash, AJAX,Flash, Silverlight ... nhưng đó mới chỉ là nhận định. Việc nó có đạt được thành quả hay không thì hãy còn chờ, nhưng trước mắt, nó sẽ đơn giản quá quá trình code của lập trình viên với các ứng dụng desktop trên Java.
Là một scripting language, cú pháp rất gần gũi và dễ học. Nếu bạn có kinh nghiệm với Swing, kiến thức về SQL, từng làm việc qua với một scripting nào đó như JavaScript, Ruby hay Groovy thì việc học và làm việc với JavaFX là quá dễ dàng. Cam đoan với bạn là học không đến một ngày đâu. Do đó đừng vội vàng gì mà ôm lấy JavaFX để học ngay khi người ta còn đang ba hoa về nó. Khi nào cần thì hãy đụng đến nó, thời gian để tập trung vào những việc khác tốt hơn, chẳng hạn như ngồi viết linh tinh như tôi bây giờ đây này. Tôi cũng chả học nó làm gì, khi thấy Java One quảng cáo thì down code về cùng lướt qua mấy tutorial rồi nổi hứng điên điên viết bài viết này. Chứ thực lòng có học gì đâu, cũng chả làm việc bao giờ, thậm chí tôi cũng không thèm bật Netbean lên để gõ vài dòng xem nó thế nào nữa. Hì, đừng học bạn nhé, mất thời gian, khi nào cần thì mần cũng được.


Theo blog Nhữ Đình Thuận

No comments:

Post a Comment