Các nền tảng nào bạn nên chọn để lập trình ứng dụng Java Desktop?
1. Giới thiệu
Thực tế có một số câu hỏi thông dụng với Java:
- Tôi nên chọn giải pháp nào để lập trình một ứng dụng Desktop
- Có một giải pháp nào để lập trình một website có giao diện giống ứng dụng Desktop không?
Trong tài liệu này tôi sẽ trả lời tổng quan về câu hỏi trên đồng thời có các giải pháp giúp bạn làm được điều đó.
Ứng dụng Desktop:
Đây là một ứng dụng Desktop viết bằng Java (Java Swing):
Ứng dụng web:
Và đây là một ứng dụng Web có giao diện giống giao diện một ứng dụng Desktop, nó được viết trên Eclipse RAP:
2. Lập trình Java ứng dụng Desktop
Thực tế để lập trình ứng dụng Desktop bạn có 2 lựa chọn
- Sử dụng Swing - Là một thư viện tích hợp sẵn trên JDK và có khả năng chạy trên mọi hệ điều hành khác nhau (Windows, Unix, Mac OS,..)
- Sử dụng SWT - Là một thư viện để lập trình ứng dụng Desktop được phát triển bởi IBM. Nó có khả năng chạy trên mọi hệ điều hành khác nhau (Window, Unix, Mac OS,..)
Đây là hình ảnh một ứng dụng Desktop viết bằng SWT và chạy trên các hệ điều hành khác nhau:
Đây là hình ảnh ứng dụng Desktop viết bằng Swing. Với "Look And Feel" mặc định trông nó khá ngô nghê. Trong lập trình bạn có thể chọn một L-A-F khác để có được giao diện giống với Windows hoặc Linux nếu muốn.
Swing
AWT (Abstract Window Toolkit) - là một bộ thư viện được phát triển dành cho lập trình Desktop có sẵn trong JDK, tuy nhiên đáng tiếc là nó hoạt động không như mong muốn trên các hệ điều hành khác nhau. Đó là lý do Swing được ra đời thay thế cho AWT, để đảm bảo rằng nó chạy tốt trên các hệ điều hành khác nhau.
Swing xây dựng giao diện đồ họa hoàn toàn bằng Java. Và chạy trên mọi hệ điều hành. Nó không thay thế AWT mà thừa kế từ AWT, đây là một điểm yếu của nó là bối rối những người lập trình, một số lượng lớn các lớp thuộc AWT giờ đã không còn được dùng nữa, hoặc nó lại là lớp để các lớp của Swing thừa kế. Theo tôi chính điều này làm Swing bị đánh giá thấp.
SWT (Standard Widget Toolkit)
SWT (Standard Widget Toolkit) là một thư viện lập trình ứng dụng Desktop được phát triển bởi IBM. Nó không phát triển đồ họa hoàn toàn bằng Java. Khi chạy trên hệ điều hành nào, nó cố gắng tận dụng các giao diện đồ họa của hệ điều hành đó (Button, Label, ...) và chỉ tạo đồ họa thành phần mà hệ điều hành đó không có bằng Java.
Nếu lập trình SWT tốt nhất bạn chọn Eclipse IDE để lập trình. Eclipse có thể tích hợp plugin WindowBuilder hỗ trợ kéo thả các thành phần giao diện vô cùng dễ dàng. WindowBuilder vốn là một sản phẩm thương mại nay đã được miễn phí sử dụng khi tích hợp vào Eclipse.
So sánh SWT và Swing
Swing là một thư viện thuần Java, khi bạn lập trình xong ứng dụng bạn có thể sét đặt Look And Feel (Nhìn và cảm nhận) để có một giao diện giống của Windows, hoặc Linux hoặc Mac Os,... Có sẵn một số Look And Feel trên JDK bạn có thể sử dụng hoặc có thể mua các L-A-F. Như vậy bạn có chạy một ứng dụng Swing trên hệ điều hành Windows mà giao diện hiển thị lên lại là của Linux, Mac Os, ..
Đây là một link giới thiệu về các L-A-F đẹp:
SWT - Đây là một thư viện không viết hoàn toàn bằng Java. Khi nó chạy trên hệ điều hành nào nó cố gắng tận dụng các thư viện thành phần của hệ điều hành đó (chẳng hạn tận dụng các Button, Label, Frame, ...), và chỉ dùng Java để vẽ các thành phần nếu nó không có trên hệ điều hành. Như vậy về tốc độ SWT nhanh hơn Swing.
Với SWT chúng ta không có khái niệm Look And Feel như Swing. Khi bạn chạy ứng dụng trên nền hệ điều hành nào, giao diện sẽ mang đặc tính của hệ điều hành đó.
So sánh tốc độ:
Bạn nên chọn SWT hay Swing?
Tôi nghĩ rằng bạn nên chọn SWT cho việc lập trình ứng dụng Desktop vì đây là một bộ thư viện phong phú các thành phần giao diện khác nhau. Hơn nữa nó là bộ thư viện ra đời sau Swing, nó học hỏi và giải quyết các yếu điểm của Swing.
SWT với các bộ thư viện mở rộng đang được phát triển thêm, chẳng hạn như:
Eclipse phát triển một nền tảng mới gọi là RAP (Remote Application Platform) - RAP cho phép bạn lập trình các ứng dụng có giao diện giống các ứng dụng Desktop, và lại sử dụng các class quen thuộc có trong SWT. Như vậy bạn có thể viết một ứng dụng mà có thể chạy cả trên nền Web và chạy cả trên nền Desktop. Đây là một điểm mạnh nếu bạn chọn SWT.
Hãy xem một Demo (bản giới thiệu) chương trình viết bằng RAP:
3. Công nghệ của Eclipse
Chúng ta cần có một cái nhìn về công nghệ của Eclipse
RCP (Rich Client Platform) : Là một platform sử dụng thư viện SWT để lập trình các ứng dụng Desktop. Có thể chạy trên mọi hệ điều hành khác nhau.
(Chi tiết hơn về RCP được đề cập ở phần sau.)
(Chi tiết hơn về RCP được đề cập ở phần sau.)
RAP (Remote Application Platform): Là một Platform sử dụng thư viện RWT để lập trình các ứng dụng chạy trên Web giống ứng dụng Desktop.
- RWT (RAP Widget Toolkit) là bộ thư viện với các class cùng tên với class của SWT, và có các method tương tự, giúp bạn lập trình các ứng dụng RAP chạy trên Web. Chính vì đặc tính này chỉ cần 1 source code, bạn có thể chạy ứng dụng trên nền Desktop hoặc trên nền Web.
RAP chạy tốt trên các trình duyệt khác nhau.
Tabris - Là một bộ thư viện viết cho các ứng dụng Mobile, và chạy được trên các loại Mobile khác nhau.
4. RCP làm được những gì?
RCP (Rich Client Platform) : Là một Platform sử dụng thư viện SWT để lập trình các ứng dụng Desktop. Chạy trên mọi hệ điều hành khác nhau, nó chính là platform viết ra Eclipse IDE.
Như vậy RCP là một Platform sử dụng SWT làm cơ sở để xây dựng lên. Bạn có thể sử dụng Platform RCP để lập trình lên ứng dụng Desktop.
Hình minh họa dưới đây là một ứng dụng đơn giản (Chỉ dùng tới SWT, chưa dùng gì tới những thứ cao cấp của RCP Platform):
RCP Platform đã xây dựng một nền tảng cho phép bạn lập trình ra các giao diện có cấu trúc phức tạp giống Eclipse IDE, nó bao gồm các hệ thống Menu, Toolbar, View, Editor, ...
RCP cũng cho phép bạn phát triển các Plugin tích hợp vào Eclipse mà bạn đang sử dụng.
5. RAP làm được những gì?
RAP (Remote Application Platform): Là một Platform sử dụng thư viện RWT để lập trình các ứng dụng chạy trên Web giống ứng dụng Desktop.
- RWT (RAP Widget Toolkit) là bộ thư viện với các class cùng tên với class của SWT, và có các method tương tự, giúp bạn lập trình các ứng dụng RAP chạy trên Web. Chính vì đặc tính này chỉ cần 1 source code, bạn có thể chạy ứng dụng như một ứng dụng Desktop hoặc trên Web.
Cũng giống như RCP, RAP là một Platform, nó cũng cho phép tạo ra các ứng dụng có giao diện phức tạp giống Eclipse IDE.
6. RAP & RCP - Tại sao code rất giống nhau?
Đây là cấu trúc 2 Platform:
- RCP sử dụng SWT (Standard Widget Toolkit)
- RAP sử dụng RWT (RAP Widget Toolkit)
Đây là một ví dụ, thêm một Button vào một Composite:
** MyApplicationWindow **
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
public class MyApplicationWindow {
.......
protected void createContents() {
.......
Composite composite = new Composite(shell, SWT.NONE);
composite.setLayout(new GridLayout(1, false));
Button btnMyButton = new Button(composite, SWT.NONE);
btnMyButton.setText("My Button");
}
}
SWT, và RWT đều sử dụng class org.eclipse.swt.widgets.Button để tạo Button .
Code của lớp Button trong SWT (chạy trên desktop) rõ ràng khác với code class Button của RWT (vốn để chạy trên WEB).
Code của lớp Button trong SWT (chạy trên desktop) rõ ràng khác với code class Button của RWT (vốn để chạy trên WEB).
- Class Button của SWT được đóng gói trong file jar có tên org.eclipse.swt_*.jar
- Class Button của RWT được đóng gói trong file jar có tên org.eclipse.rap.rwt_*.jar
Target Platform là một môi trường thư viện, bạn có thể khai báo.
Bạn có thể khai báo ra 2 Target Platform. Một cái gồm các thư viện RCP, và một cái gồm các thư viện RAP.
Tất nhiên RAP và RCP có đôi chút khác biệt, không phải tất cả các thành phần của SWT đều có tương ứng trên RWT, và ngược lại. Tùy trường hợp có thể sử lý các khác biệt này. Các ứng dụng có thể chạy trên trên cả nền Desktop và Web được biết tới với khái niệm "Single Sourcing".
Bạn có thể khai báo ra 2 Target Platform. Một cái gồm các thư viện RCP, và một cái gồm các thư viện RAP.
- RCP Target Platform
- RAP Target Platform
Tất nhiên RAP và RCP có đôi chút khác biệt, không phải tất cả các thành phần của SWT đều có tương ứng trên RWT, và ngược lại. Tùy trường hợp có thể sử lý các khác biệt này. Các ứng dụng có thể chạy trên trên cả nền Desktop và Web được biết tới với khái niệm "Single Sourcing".
7. Bạn nên bắt đầu từ đâu?
Nếu bạn theo hướng lập trình RAP-RCP. Bạn cần phải tìm hiểu về SWT, điều đó cũng có nghĩa là bạn sẽ dễ dàng biết RWT.
Làm việc với SWT nghĩa là làm việc với các đối tượng Widget (Button, Label, ..) và xử lý Layout. WindowBuilder là một plugin cho phép kéo thả các thành phần lên giao diện, và tự động tạo ra code tương ứng.
Làm việc với SWT nghĩa là làm việc với các đối tượng Widget (Button, Label, ..) và xử lý Layout. WindowBuilder là một plugin cho phép kéo thả các thành phần lên giao diện, và tự động tạo ra code tương ứng.
Bạn có thể tham khảo tài liệu dưới đây, nó hướng dẫn lập trình SWT với WindowBuilder là công cụ trực quan, dễ dàng kéo thả các thành phần giao diện.
Sau khi bạn thành thạo lập trình với SWT bạn có thể tiếp tục với RCP hoặc RAP.
SWT:
RCP
RAP
Eclipse RAP
- Đóng gói và triển khai ứng dụng Eclipse RAP
- Hướng dẫn lập trình Eclipse RAP cho người mới bắt đầu - Ứng dụng cơ bản
- Cài đặt RAP Tools cho Eclipse
- Các nền tảng nào bạn nên chọn để lập trình ứng dụng Java Desktop?
- Hướng dẫn lập trình Eclipse RAP cho người mới bắt đầu - Ứng dụng e4 Workbench
- Cài đặt Eclipse RAP Target Platform
- Hướng dẫn lập trình Eclipse RAP cho người mới bắt đầu - Ứng dụng Workbench (trước e4)
- Tạo Eclipse RAP Widget từ ClientScripting widget
- Cài đặt RAP e4 Tooling cho Eclipse
Show More
Eclipse RCP
- Các nền tảng nào bạn nên chọn để lập trình ứng dụng Java Desktop?
- Lập trình ứng dụng Java Desktop sử dụng SWT
- Hướng dẫn lập trình Eclipse RCP 4 cho người mới bắt đầu - Ứng dụng e4 Workbench
- Đóng gói và triển khai ứng dụng Desktop SWT/RCP
- Hướng dẫn lập trình Eclipse RCP 3 cho người mới bắt đầu - Ứng dụng Workbench
- Cài đặt e4 Tools Developer Resources cho Eclipse
- Ứng dụng Eclipse RCP 3 đơn giản - Tương tác View và Editor
Show More
Công nghệ của Eclipse
- Làm sao để có các thư viện mã nguồn mở Java dưới dạng OSGi
- Cài đặt Tycho cho Eclipse
- Hướng dẫn lập trình Java OSGi cho người mới bắt đầu
- Tạo dự án Java OSGi với Maven và Tycho
- Cài đặt WindowBuilder cho Eclipse
- Các nền tảng nào bạn nên chọn để lập trình ứng dụng Java Desktop?
- Lập trình ứng dụng Java Desktop sử dụng SWT
- Hướng dẫn và ví dụ Eclipse JFace
- Cài đặt e4 Tools Developer Resources cho Eclipse
- Đóng gói và triển khai ứng dụng Desktop SWT/RCP
- Cài đặt Eclipse RAP Target Platform
- Cài đặt EMF cho Eclipse
- Cài đặt RAP e4 Tooling cho Eclipse
- Tạo Eclipse RAP Widget từ ClientScripting widget
- Cài đặt GEF cho Eclipse
- Hướng dẫn lập trình Eclipse RAP cho người mới bắt đầu - Ứng dụng Workbench (trước e4)
- Hướng dẫn lập trình Eclipse RCP 3 cho người mới bắt đầu - Ứng dụng Workbench
- Ứng dụng Eclipse RCP 3 đơn giản - Tương tác View và Editor
- Hướng dẫn lập trình Eclipse RCP 4 cho người mới bắt đầu - Ứng dụng e4 Workbench
- Cài đặt RAP Tools cho Eclipse
- Hướng dẫn lập trình Eclipse RAP cho người mới bắt đầu - Ứng dụng cơ bản
- Hướng dẫn lập trình Eclipse RAP cho người mới bắt đầu - Ứng dụng e4 Workbench
- Đóng gói và triển khai ứng dụng Eclipse RAP
Show More
Java cơ bản
- Tùy biến trình biên dịch java xử lý Annotation của bạn (Annotation Processing Tool)
- Lập trình Java theo nhóm sử dụng Eclipse và SVN
- Hướng dẫn và ví dụ Java WeakReference
- Hướng dẫn và ví dụ Java PhantomReference
- Hướng dẫn nén và giải nén trong Java
- Cấu hình Eclipse để sử dụng JDK thay vì JRE
- Phương thức String.format() và printf() trong Java
- Cú pháp và các tính năng mới trong Java 5
- Cú pháp và các tính năng mới trong Java 8
- Hướng dẫn sử dụng biểu thức chính quy trong Java
- Hướng dẫn lập trình đa luồng trong Java - Java Multithreading
- Thư viện điều khiển các loại cơ sở dữ liệu khác nhau trong Java
- Hướng dẫn sử dụng Java JDBC kết nối cơ sở dữ liệu
- Lấy các giá trị của các cột tự động tăng khi Insert một bản ghi sử dụng JDBC
- Hướng dẫn và ví dụ Java Stream
- Functional Interface trong Java
- Giới thiệu về Raspberry Pi
- Hướng dẫn và ví dụ Java Predicate
- Abstract class và Interface trong Java
- Access modifier trong Java
- Hướng dẫn và ví dụ Java Enum
- Hướng dẫn và ví dụ Java Annotation
- So sánh và sắp xếp trong Java
- Hướng dẫn và ví dụ Java String, StringBuffer và StringBuilder
- Hướng dẫn xử lý ngoại lệ trong Java - Java Exception Handling
- Hướng dẫn và ví dụ Java Generics
- Thao tác với tập tin và thư mục trong Java
- Hướng dẫn và ví dụ Java BiPredicate
- Hướng dẫn và ví dụ Java Consumer
- Hướng dẫn và ví dụ Java BiConsumer
- Bắt đầu với Java cần những gì?
- Lịch sử của Java và sự khác biệt giữa Oracle JDK và OpenJDK
- Cài đặt Java trên Windows
- Cài đặt Java trên Ubuntu
- Cài đặt OpenJDK trên Ubuntu
- Cài đặt Eclipse
- Cài đặt Eclipse trên Ubuntu
- Học nhanh Java cho người mới bắt đầu
- Lịch sử của bit và byte trong khoa học máy tính
- Các kiểu dữ liệu trong Java
- Các toán tử Bitwise
- Câu lệnh rẽ nhánh (if else) trong Java
- Câu lệnh rẽ nhánh switch trong Java
- Vòng lặp trong Java
- Mảng (Array) trong Java
- JDK Javadoc định dạng CHM
- Thừa kế và đa hình trong Java
- Hướng dẫn và ví dụ Java Function
- Hướng dẫn và ví dụ Java BiFunction
- Ví dụ về Java encoding và decoding sử dụng Apache Base64
- Hướng dẫn và ví dụ Java Reflection
- Hướng dẫn gọi phương thức từ xa với Java RMI
- Hướng dẫn lập trình Java Socket
- Các nền tảng nào bạn nên chọn để lập trình ứng dụng Java Desktop?
- Hướng dẫn và ví dụ Java Commons IO
- Hướng dẫn và ví dụ Java Commons Email
- Hướng dẫn và ví dụ Java Commons Logging
- Tìm hiểu về Java System.identityHashCode, Object.hashCode và Object.equals
- Hướng dẫn và ví dụ Java SoftReference
- Hướng dẫn và ví dụ Java Supplier
- Lập trình Java hướng khía cạnh với AspectJ (AOP)
Show More
- Hướng dẫn lập trình Java Servlet/JSP
- Các hướng dẫn Java Collections Framework
- Java API cho HTML & XML
- Các hướng dẫn Java IO
- Các hướng dẫn Java Date Time
- Các hướng dẫn Spring Boot
- Các hướng dẫn Maven
- Các hướng dẫn Gradle
- Các hướng dẫn Java Web Services
- Các hướng dẫn lập trình Java SWT
- Các hướng dẫn lập trình JavaFX
- Các hướng dẫn Java Oracle ADF
- Các hướng dẫn Struts2 Framework
- Các hướng dẫn Spring Cloud