JavaFX so với WPF như thế nào? [đóng cửa]


93

Tôi hầu hết là một lập trình viên C #, tôi đã ngừng viết Java khoảng 10 năm trước, nhưng tôi cố gắng theo kịp công nghệ trong Java bằng cách đọc các bài báo, nói chuyện với bạn bè, v.v.

Tôi đã nghe nói về khung công tác GUI phong phú mới có tên là JavaFX, nhưng không thể tìm thấy bất kỳ tài nguyên nào so sánh nó với các đối tượng không phải Java.

Vì tôi rất quen thuộc với C # và WPF, tôi muốn cảm nhận về sự giống hoặc khác nhau của hai công nghệ này.

CHỈNH SỬA: Thấy không có câu trả lời nào đến, tôi sẽ cố gắng nói cụ thể hơn:

  1. WPF sử dụng XAML để tạo cây trực quan, JavaFX có cái gì tương tự không?
  2. WPF được sử dụng tốt nhất với liên kết với một mô hình xem trong một mẫu MVVM, JavaFX cũng sử dụng liên kết rộng rãi?
  3. WPF sử dụng GPU để hiển thị, JavaFX có làm như vậy không?
  4. Silverlight so với JavaFX như thế nào khi chạy qua trình duyệt trên máy tính mạng?

... Nhiều hơn nữa sẽ đến ...

Tôi đang thay đổi điều này thành wiki cộng đồng để các so sánh có thể tiếp tục được cập nhật (hy vọng).


7
Thật buồn cười khi một câu hỏi với 83 phiếu ủng hộ có thể được coi là không mang tính xây dựng.
kristianp

Câu trả lời:


120

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 Regionlớ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 CheckBoxcho 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 TabPanetrì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.


9
Cảm ơn rất nhiều vì điều này, điều này rất giáo dục. Nếu bạn có thể nâng cao hơn nữa câu trả lời này khi bạn nâng cao hơn nữa kiến ​​thức của mình về JavaFX thì quả là tuyệt vời.
Aviad P.

5
Tôi cũng rất thích đọc câu trả lời của bạn và rất muốn nghe thêm nếu công việc của bạn với JavaFX tiết lộ thêm thông tin chi tiết.
Paul-Sebastian Manole

21

Tôi nghĩ rằng cách tốt nhất để cảm nhận về JavaFX là chỉ cần dùng thử. Có một số hướng dẫn tốt trên trang web JavaFX. Đây là một vài:

Chúng khá nhanh và cho bạn cảm giác tốt với ngôn ngữ. Có nhiều người khác trên JavaFX trang nếu bạn quan tâm đến các hướng dẫn và bài viết khác.

Để có câu trả lời cụ thể cho câu hỏi của bạn:

  1. JavaFX có ngôn ngữ khai báo riêng để tạo "cây trực quan" không phải là dẫn xuất xml. Giao diện người dùng dựa trên biểu đồ cảnh để bạn có thể áp dụng các hiệu ứng và hoạt ảnh khác nhau cho bất kỳ nút nào trong biểu đồ. Xem hướng dẫn để biết thêm thông tin. Ngoài ra còn có một công cụ thiết kế cho JavaFX (mà tôi chưa thử).
  2. JavaFX có ràng buộc được xây dựng trong ngôn ngữ .
  3. JavaFX trên máy tính để bàn sử dụng Java AWT / Swing sử dụng kết xuất GPU. Mọi phiên bản của Java dường như tải nhiều đồ họa hơn vào GPU. Chris Campbell từ Sun đã viết một số blog về tăng tốc GPU . Tôi không chắc liệu phiên bản di động của JavaFX có tăng tốc GPU hay không. Tôi nhận thấy rằng các phiên bản JavaFX trước đó không đủ hiệu suất cho những gì tôi cần, nhưng tôi biết phiên bản mới nhất có những cải tiến hiệu suất đáng kể so với các phiên bản trước và họ vẫn đang làm việc để làm cho nó nhanh hơn.
  4. JavaFx sử dụng Java Applet để chạy trong trình duyệt. Kể từ bản cập nhật Java 6 10, khung ứng dụng Java đã được làm lại và mặc dù nó không liền mạch như Adobe flash nhưng nó đã được cải thiện nhiều. Tôi không chắc nó như thế nào so với Silverlight ngoài việc tôi đã gặp khó khăn để Silverlight hoạt động trên Linux, nhưng đã làm cho JavaFX hoạt động trên Linux.

Đây là một câu hỏi liên quan khác .


15
Câu trả lời này đã lỗi thời vì JavaFX đã trải qua các bản cập nhật quan trọng trong Java 7. Xem tại đây .
Zoltán

7
Bạn có chắc rằng JavaFX sử dụng swing và AWT không? Tôi tin rằng nó có công cụ kết xuất riêng gọi là lăng kính. Không có luồng Sự kiện nào được tạo khi chạy ứng dụng JavaFX.
Andy Till
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.