Tôi đã học JavaFX trong vài tuần qua. Dưới đây là tổng quan cấp cao về cách nó so sánh với WPF trong mắt tôi:
Tất cả các nhận xét của tôi đều liên quan đến JavaFX 2.0. Thông tin này có thể sẽ thay đổi vì nền tảng vẫn còn khá non nớt và đang được phát triển tích cực.
Đồ họa
Giống như WPF, JavaFX sử dụng một hệ thống kết xuất đồ họa được giữ lại. Giao diện người dùng bao gồm một biểu đồ cảnh bao gồm các 'nút' có thể được coi là tương tự về mặt khái niệm với WPF'sUIElement
.
JavaFX sẽ tải đồ họa hiển thị xuống GPU nếu có. Hệ thống đồ họa sử dụng DirectX trên Windows và OpenGL trên các nền tảng khác.
Đánh dấu
Giao diện người dùng JavaFX có thể được tạo cả bằng mã và thông qua đánh dấu FXML, tương tự như XAML ở chỗ đồ thị đối tượng có thể được tạo bằng các phần tử lồng vào nhau.
FXML có một số tính năng tương tự như XAML như ràng buộc thuộc tính (chỉ các biểu thức đơn giản) và ràng buộc với các trình xử lý sự kiện (bất kỳ onEvent nào phương thức ). Trình xử lý sự kiện có thể được khai báo trong dòng nhưng thông thường bạn sẽ liên kết với một sự kiện trong trình điều khiển được liên kết.
Các tệp FXML có thể có một bộ điều khiển liên kết cho phép bạn khai báo các trình xử lý sự kiện phức tạp và thiết lập các ràng buộc giữa các thuộc tính. Đây là một bộ điều khiển theo nghĩa MVC và không giống như một mô hình xem trong thế giới WPF (thông thường một bộ điều khiển sẽ có tham chiếu đến các nút và điều khiển).
Một điểm khác biệt đối với WPF là dường như FXML không được biên dịch thành một biểu diễn nhị phân trung gian như BAML. Tôi chưa nhận thấy bất kỳ vấn đề hiệu suất nào nhưng chưa sử dụng hệ thống một cách rộng rãi. Mặc dù vậy, tôi đã nhận thấy rằng FXML thường có xu hướng ngắn hơn bất kỳ XAML nào vì nền tảng này vẫn khuyến khích bạn viết mã và các kiểu được khai báo riêng biệt.
Giới thiệu về FXML có thể được tìm thấy tại đây .
Trình tạo cảnh được cung cấp miễn phí (như trong bia), vì vậy nếu bạn không thích viết tay giao diện người dùng, bạn có thể kéo và thả các phần tử, đặt thuộc tính và liên kết với mã trong bộ điều khiển của bạn và FXML sẽ được tạo tự động. Rõ ràng là trình tạo cảnh không mạnh bằng Expression Blend nhưng nó vẫn tốt hơn 'trình thiết kế' được cung cấp bởi Visual Studio.
Ràng buộc
JavaFX có một thuộc tính và hệ thống ràng buộc rất mạnh mẽ. Mẫu Java Bean đã được mở rộng để bao gồm các lớp đóng gói một thuộc tính (tương tự như cách các thuộc tính phụ thuộc WPF đại diện cho các thuộc tính). Các lớp này triển khai các giao diện cung cấp thông báo thay đổi và hủy bỏ hiệu lực.
Có sự phân biệt giữa thông báo vô hiệu và thông báo thay đổi. Sự không hợp lệ chỉ cho bạn biết rằng biểu thức ràng buộc bây giờ không hợp lệ và cần được tính toán lại; việc tính toán lại không thực sự xảy ra cho đến khi bạn yêu cầu giá trị tài sản thông qua get()
hoặcgetValue()
các phương thức . Tuy nhiên, nếu bạn đã đăng ký một trình nghe thay đổi, thì biểu thức sẽ được đánh giá lại ngay lập tức và bất kỳ thứ gì liên kết với thuộc tính đó sẽ phản ánh các thay đổi.
JavaFX thể hiện các thuộc tính này theo cách tương tự như WPF với thuộc tính get and set và phương thức trả về một thể hiện của trình bao bọc thuộc tính (không phải là thuộc tính tĩnh như thuộc tính WPF).
Các ràng buộc phức tạp có thể được tạo giữa nhiều thuộc tính. Muốn một thuộc tính số nguyên là tổng của hai số khác (a = b + c)? Không sao, JavaFX cung cấp một API thông thạo để thể hiện các loại mối quan hệ này EG
A. Thêm (B, C);
Nếu giá trị của B hoặc C thay đổi thì các thông báo thích hợp sẽ được nâng lên để hệ thống biết rằng A cần được đánh giá lại. Lưu ý rằng trong trường hợp này, một ngoại lệ sẽ được ném ra nếu bạn thử và đặt giá trị của A vì nó được liên kết với các thuộc tính khác nên nó không có ý nghĩa trong ngữ cảnh này.
Các biểu thức này có thể là EG khá phức tạp a = (b + c) * (d - e)
và có thể bao gồm bất kỳ số thuộc tính nào. API thông thạo khá dễ đọc và dễ sử dụng nhưng không đẹp như một số API thông thạo được cung cấp bởi một số thư viện của Microsoft nhưng điều này phụ thuộc nhiều vào các hạn chế của ngôn ngữ Java hơn là bản thân JavaFX.
Các ràng buộc hai hướng đơn giản có thể được tạo ra giữa các thuộc tính cùng loại để nếu cái này được cập nhật thì cái kia sẽ tự động phản ánh sự thay đổi.
JavaFX cũng cung cấp một API cấp thấp để tự tùy chỉnh các ràng buộc nếu bạn muốn tạo một biểu thức ràng buộc tùy chỉnh không được cung cấp bởi API hoặc nếu bạn lo lắng về hiệu suất.
Một trong những điểm khác biệt lớn nhất giữa JavaFX và WPF là các liên kết chủ yếu được thực hiện trong mã trong JavaFX so với cách WPF thiết lập các liên kết trong đánh dấu.
Có thể tìm thấy phần giới thiệu về các thuộc tính và ràng buộc tại đây .
Phong cách
JavaFX sử dụng CSS để thay đổi giao diện của các nút có trong biểu đồ cảnh. Có một thông số kỹ thuật đầy đủ giải thích các loại và các thuộc tính có thể được đặt trên mỗi loại nút.
JavaFX cũng cung cấp một số bổ sung giúp cải thiện CSS, chẳng hạn như các biến có thể được xác định và sử dụng ở những nơi khác EG
.button {
my-custom-color: RGB(234, 44, 78);
}
.my-control {
-fx-background-color: my-custom-color
}
Nó cũng cung cấp một số chức năng cho phép bạn lấy màu từ các màu khác đã được xác định trước đó, rất hữu ích để tạo những thứ như gradient. Điều này có nghĩa là một bảng màu cơ bản có thể được xác định và phần còn lại có thể được tạo ra từ các giá trị này (đây là những gì tệp JavaFX CSS mặc định làm).
JavaFX CSS không cho phép bạn xác định kiểu bố cục được sử dụng bởi một nút (khi viết tất cả bố cục này cần được thực hiện bằng mã). Điều này thực sự hiệu quả đối với tôi vì đây là một khía cạnh của CSS thực sự khiến tôi đau đầu khi sử dụng nó với HTML.
Cá nhân tôi thích CSS hơn là các kiểu XAML có xu hướng quá dài dòng so với sở thích của tôi.
Hướng dẫn về JavaFX CSS có thể được tìm thấy tại đây .
Bố trí
JavaFX cung cấp một số ngăn bố cục tương tự như ngăn được cung cấp bởi WPF. Một điểm khác biệt mà tôi nhận thấy là hợp đồng đo lường và bố cục được xác định sâu hơn trong chuỗi kế thừa trong Region
lớp.
Như đã đề cập trước đây, Bố cục không thể được thực hiện bằng CSS nhưng có thể được thể hiện bằng mã, FXML hoặc được tạo bằng trình tạo cảnh (cuối cùng được chuyển đổi thành FXML).
Kiểm soát
JavaFX cung cấp một thư viện điều khiển ngày càng phát triển mà chúng tôi mong đợi. Một sự khác biệt chính giữa JavaFX và WPF là các điều khiển về cơ bản là hộp đen và không thể được tạo khuôn mẫu lại theo cách mà các điều khiển WPF có thể. Chúng dường như cũng hiển thị ít thuộc tính hơn nhiều so với các điều khiển WPF.
Các điều khiển hiển thị một số khu vực triển khai cụ thể cho CSS cho phép các khu vực cụ thể của điều khiển được nhắm mục tiêu theo kiểu của bạn. Đây được gọi là cấu trúc con của kiểm soát. EG a CheckBox
cho thấy hai cấu trúc con; hộp và dấu kiểm cho phép tạo kiểu độc lập cho từng phần của điều khiển. Lưu ý rằng như đã mô tả trước đó, chỉ có thể thay đổi giao diện của một điều khiển bằng cách sử dụng CSS nhưng cảm giác thì không thể. EG bạn không thể thay đổi đáng kể cách TabPane
trình bày nội dung của nó bằng cách thay đổi bảng bố cục bên trong theo cách bạn có thể làm với WPF TabControl
.
Trong khi điều này nghe có vẻ khá hạn chế, cách ưa thích để tạo các điều khiển tùy chỉnh trong JavaFX dường như là sử dụng bố cục dọc theo đường dẫn xuất từ bảng điều khiển bố cục để định vị các điều khiển tiêu chuẩn và định dạng lại chúng bằng CSS.
Phần kết luận
Nhìn chung, tôi rất ấn tượng với những gì JavaFX cung cấp vào lúc này. Mặc dù chưa đến mức trưởng thành như WPF nhưng nó vẫn đang được phát triển tích cực và Oracle chắc chắn đang ủng hộ điều này. Thời gian sẽ trả lời nếu nó thành công hay không.
Tôi khuyên bạn nên dùng thử JavaFX. Đọc tài liệu và thử ghép một ứng dụng nhỏ lại với nhau và xem bạn nghĩ gì.
Bạn cũng nên xem FXExperience.com được cập nhật thường xuyên với thông tin từ nhóm phát triển.