Professional Documents
Culture Documents
Scroll
bar
Button
Lập trình GUI trong Java
● AWT
○ Java 1.0
● Swing
○ Nâng cấp các thành phần giao diện của AWT
○ Tích hợp trong Java 1.2
● JavaFX
○ Phát triển ứng dụng đa nền tảng (Desktop, mobile, TV, tablet
● Một số thư viện khác:
○ Eclipse’s Standard Widget Toolkit (SWT)
○ Google Web Toolkit (GWT)
○ …
So sánh giữa các thư viện
2
JavaFX
Một số tính năng của JavaFX
● Hỗ trợ FXML (tương tự HTML)
● Scene Builder: JavaFX cung cấp ứng dụng Scene Builder cho phép kéo
● Tương thích với Swing: có thể nhúng các thành phần Swing
● CSS like styling: thiết kế giao diện với tính năng tương tự trong CSS
Tiện ích JavaFX trên IntellIj
3
Các thành phần của JavaFX
Stage, Scene, Node
Các thành phần giao diện JavaFX - Stage
Stage:
3 thành phần chính ● Là đối tượng lớp javafx.stage.Stage
● Chứa tất cả đối tượng khác của ứng dụng
JavaFX
● Bao gồm: Content Area (nội dung), Decoration
(tiêu đề và viền)
● Đối tượng stage được truyền như đối số cho
phương thức start() của lớp Application
● Tham số: width và height
● Phải gọi phương thức show() để hiển thị
Stage - styles
Có 5 styles cho Stage:
1. stage.initStyle(StageStyle.DECORATED);
2. stage.intStyle(StageStyle.UNDECORATED);
3. stage.initStyle(StageStyle.TRANSPARENT);
4. stage.initStyle(StageStyle.UNIFIED);
5. stage.initStyle(StageStyle.UTILITY);
Các thành phần giao diện JavaFX - Scene
Scene:
3 thành phần chính
● Là đối tượng lớp javafx.scene.Scene
● Chứa tất cả nội dung biểu diễn của một scene graph
● Mỗi Scene được thêm vào một Stage duy nhất
● Phương thức khởi tạo:
○ Scene (Parent root)
○ Scene (Parent root, double width, double height)
○ …
Scene Graph và Nodes
Scene Graph:
● Cấu trúc dữ liệu phân cấp cây
● Biểu diễn nội dung một Scene: controls và layout
Node:
● Là lớp cơ sở của các loại Node: javafx.scene.Node
● Biểu diễn đối tượng đồ hoạ của một Scene graph
○ Các phần tử hình học 2D hoặc 3D: Circle, Rectangle, Polygon, …
○ Phần tử tương tác: Button, Checkbox, TextArea, …
○ Phần tử đa phương tiện: Audio, Video, Image, …
Nodes
● Branch/Parent Node
○ Là node chứa các node con (lớp cơ sở là javafx.scene.Parent)
○ Group: chứa một list các node con được áp dụng cùng một hiệu ứng
chuyển đổi
○ Region: lớp cơ sở cho các UI Controls: Chart, Pane, Control
○ Webview: tương tự như Browser
● Leaf Node
○ node không có node con
○ Rectangle, Ellipse, Box, ImageView, MediaView
Cây phân cấp kế thừa Node
javafx.scene.Node
javafx.scene.Parent
javafx.scene.Group javafx.scene.layout.Region
Nền trời
Tháp
Tạo đối tượng Scene, bắt buộc phải truyền tham số là đối tượng root
3&4
Có thể tạo đối tượng Scene và thiết lập kèm theo
2
1
Scene scene = new Scene(root, 600, 300);
start() - 3 & 4. Tạo và hiển thị Stage
● Là tham số cho start() trong lớp Application, KHÔNG cần khởi tạo
public void start(Stage primaryStage) {
…
}
//Creating a Scene
Viết code
Ví dụ: vẽ đường thẳng
public class DrawingLine extends Application{
@Override
public void start(Stage stage) {
//Creating a line object
Line line = new Line();
text2
4
JavaFX UI Control
JavaFX - UI Controls
Các thành phần chính của một giao diện người dùng
● Behavior: Tương tác của người dùng với UI elements trên layouts
(Event handling)
JavaFX - UI Controls
JavaFX - UI Controls
5
JavaFX Layout Pane
Layout Panes (Container Pane)
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("HBox Experiment 1");
}
Layout HBox
BOTTOM_CENTER
BASELINE_RIGHT
TOP_LEFT
Ví dụ
Viết ứng dụng có giao diện như sau
6
Xử lý sự kiện
(Event handling)
Sự kiện trong JavaFX
Quá trình xử lý sự kiện
Phân loại sự kiện
● Foreground Events: người dùng tương tác trực tiếp với UI controls
○ Click button
○ Nhập văn bản
○ Chọn item trong list
○ Cuộn trang
● Background Events: sự kiện chạy ngầm
○ Báo lỗi
○ Bộ đếm thời gian ngầm
Các sự kiện phổ biến
● Lớp cơ sở: javafx.event.Event
○ Mouse Event (lớp MouseEvent): xử lý sự kiện nhấn chuột (mouse
clicked, mouse pressed, mouse released, mouse moved, …)
○ Key Event (lớp KeyEvent): xử lý sự kiện nhấn phím (key pressed,
key released và key typed)
○ Drag Event (lớp DragEvent): xử lý sự kiện rê chuột (drag entered,
drag dropped, …)
○ Window Event (lớp WindowEvent): xử lý sự kiện hiện/ẩn cửa sổ
Lớp Event
● JavaFX cung cấp các handlers và filters để xử lý sự kiện
● Mỗi sự kiện có 4 thuộc tính:
○ Source: Đối tượng phát sinh sự kiện (chuột, bàn phím, …)
○ Target: Đối tượng nhận sự kiện
○ Type: Kiểu sự kiện (mouse pressed, mouse released, …)
○ Consumed: Sự kiện đã được tiêu thụ (consumed) hay chưa?
● Khi sự kiện xảy ra, event source tạo đối tượng event và chuyển đối tượng
đó tới bộ xử lý sự kiện, nếu sự kiện chưa được consumed thì sẽ xử lý
Ví dụ
1. Target selection
2. Route construction
3. Event capturing
4. Event bubbling
Event Handling - 1. Target selection
● Khi người dùng tương tác (vd: nhấn phím, click chuột vào nút, …)
● Hệ thống xác định phần tử được chọn (vd: nút được clicked)
● Sự kiện được tạo với thông tin:
○ Source: chuột
○ Target: nút
○ Type: click
Event Handling - 2. Route Construction
Tạo chuỗi sự kiện phát sinh (Event Dispatch chain):
đường đi từ stage tới target node
Event Handling - 3. Event Capturing
● Sau khi tạo chuỗi sự kiện, root node sẽ gửi đi sự kiện (dispatch event)
● Trên đường đi, nếu một node nào đó đăng ký filter cho sự kiện sinh ra, filter đó
được thực thi
● Nếu một filter nào đó consume event bằng phương thức consume() từ đối tượng
event tạo ra, kết thúc quá trình xử lý sự kiện
● Nếu event chưa được consumed, sự kiện sẽ truyền tới target node
3. Event Capturing - Event Filter
● Có thể dùng một filter cho một hoặc nhiều loại sự kiện
Filter:
● Nếu nội dung đã có trong TextArea, không thực hiện insert
Event Handling - 4. Event Bubbling
● Là quá trình lan truyền sự kiện từ target về root
● Sự kiện sẽ đi ngược lên trên: từ target node tới root node
● Nếu một node trong event dispatch chain đăng ký handler cho sự
kiện thì handler sẽ được thực thi
● Ngược lại, sự kiện sẽ chuyển tới root và kết thúc
Event Handling - Một số lưu ý
○ Filter: giai đoạn trước khi sự kiện tới được node mục tiêu
○ Handler: giai đoạn sau khi sự kiện tới được node mục tiêu
@Override
public void handle(MouseEvent e) {
System.out.println("Hello World");
circle.setFill(Color.DARKSLATEBLUE);
}
};
● Bỏ filter
circle.removeEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);
Event Handling - Ví dụ
public class EventFiltersExample extends Application {
@Override
public void start(Stage stage) {
Button button = new Button("Button");
TextArea text = new TextArea();
Circle circle = new Circle(25.0f);
FlowPane fp = new FlowPane(button, text, circle);
fp.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent arg0) {text.appendText("Filter in flow pane\n");}
});
@FXML
private TextArea textHello;
@Override
public void initialize(URL location, ResourceBundle resources) {
}
Lưu ý: tên Button và tên TextArea phải khớp với các id tạo trong SceneBuilder
4. Kết nối .fxml với controller
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.VBox?>
Lưu ý: thêm thuộc tính fx:controller cho thẻ Vbox, trỏ tới lớp MyController vừa
tạo (dùng full name)
5. Load file fxml trên ứng dụng
public class MyApplication extends Application {
@Override
public void start(Stage stage) throws Exception {
try{
stage.setTitle("My Application");
FXMLLoader loader = new FXMLLoader();
String fxmlActualPath =
"/Users/trinhlk/IdeaProjects/demo_hello/src/main/resources/com/example/demo_hello/test.fxml";
FileInputStream fxmlStream = new FileInputStream(fxmlActualPath);
VBox root = (VBox) loader.load(fxmlStream);
stage.setScene(new Scene(root));
stage.show();
}catch (Exception e){
e.printStackTrace();
}
}