Gridpane bottom dùng như thế nào

Học Viện Cơng Nghệ Bưu Chính Viễn Thơng
Khoa: Cơng Nghệ Thơng Tin

Học phần: Lập trình hướng đối tượng
Bài báo cáo:

Giới thiệu JavaFX
Giảng viên hướng dẫn: Thầy Nguyễn Mạnh Sơn

Hà Nội, năm 2020
1|Page

Mục lục
Chương 1.

Tổng quan về JavaFX. JavaFX là gì?..................................................................................3

1.

Giới thiệu JavaFX........................................................................................................................3

2.

Những ưu điểm nổi bật của ngơn ngữ lập trình JavaFX...............................................................3

3.

Các tính năng chính.....................................................................................................................3

4.

Những gì có thể xây dựng với JavaFX..........................................................................................4

Chương 2.

Cấu Trúc Ứng Dụng JavaFX...............................................................................................6

1.

STAGE.........................................................................................................................................6

2.

SCENE.........................................................................................................................................6

3.

SCENE GRAPH.............................................................................................................................6

Chương 3.
1.

2.

3.

4.

Các thành phần tương tác giao diện tích hợp..................................................................8

JavaFX Container Components....................................................................................................8
1.1.

Tổng quan về Container:......................................................................................................8

1.2.

Hbox và VBox:.....................................................................................................................9

1.3.

FlowPane...........................................................................................................................10

1.4.

GridPane:..........................................................................................................................11

1.5.

AnchorPane.......................................................................................................................13

1.6.

BorderPane.......................................................................................................................14

1.7.

Dialog(hộp thoại)..............................................................................................................16

1.8.

ToolBar..............................................................................................................................16

1.9.

ProgressBar.......................................................................................................................17

JavaFX Controller Components.................................................................................................18
1.1.

Label.................................................................................................................................18

1.2.

Button...............................................................................................................................19

1.3.

CheckBox...........................................................................................................................21

1.4.

ChoiceBox.........................................................................................................................23

1.5.

TextField............................................................................................................................24

1.6.

TextArea............................................................................................................................26

1.7.

PasswordField...................................................................................................................28

1.8.

Slider.................................................................................................................................29

1.9.

Table.................................................................................................................................30

Java Menu Components............................................................................................................33
1.1.

MenuBar, Menu, MenuItem..............................................................................................33

1.2.

CheckMenuItem, RadioMenuItem và SeparatorMenuItem...............................................35

1.3.

JavaFX ContextMenu.........................................................................................................37

EventHandling...........................................................................................................................39
1.1.

Foreground Events............................................................................................................39

1.2.

Background Events............................................................................................................39
2|Page

5.

CSS............................................................................................................................................42

Chương 1.
Tổng quan về JavaFX. JavaFX là gì?
1. Giới thiệu JavaFX
 JavaFX là một bộ đồ họa và các gói media cho phép các nhà phát triển thiết kế, tạo
ra, kiểm tra, gỡ lỗi và triển khai các ứng dụng khách giàu có hoạt động liên tục trên
nhiều nền tảng khác nhau.
 JavaFX là nền tảng để tạo và phân phối các ứng dụng dành cho máy tính để bàn
cũng như các ứng dụng RIAs (Rich Internet Applications) có thể chạy trên nhiều
thiết bị khác nhau.
 JavaFX được phát triển bởi kỹ sư Chris Oliver, ban đầu dự án được đặt tên là F3
(Form Follows Functions). Sau đó vào năm 2005 thì Sun Micro-Systems đã mua lại
dự án F3 và đổi tên thành JavaFX.
 JavaFX dự định thay thế hoàn toàn Swing làm thư viện GUI chuẩn cho Java SE.
JavaFX hỗ trợ cho các máy tính để bàn và trình duyệt web trên nền tảng Windows,
Linux và macOS.

2.

Những ưu điểm nổi bật của ngơn ngữ lập trình JavaFX
 JavaFX là một thư viện Java bao gồm các lớp và các giao diện được viết bằng mã
Java nguyên gốc.
 FXML là một ngôn ngữ khai báo dựa trên XML để xây dựng một giao diện người
dùng trong ứng dụng JavaFX. Lập trình viên có thể sử dụng JavaFX Scene Builder
để thiết kế giao diện đồ họa (GUI).
 JavaFX có thể được tùy biến giao diện thêm sinh động bằng cách sử dụng CSS.
 JavaFX hỗ trợ đồ họa 2D và 3D cũng như hỗ trợ âm thanh và video.
 JavaFX còn có WebView dựa trên trình duyệt WebKit, vì vậy bạn có thể nhúng các
trang web hoặc các ứng dụng web bên trong JavaFX.

3.

Các tính năng chính
 JAVA APIs: Các API được thiết kế để trở thành một thay thế thân thiện hơn cho
các ngôn ngữ của máy ảo Java (Java VM) như là Jruby và Scala
 FXML Và Scene Builder: FXML là một ngôn ngữ đánh dấu khai báo dựa trên XML
nhằm cấu tạo nên giao diện ứng dụng JavaFX. Người dùng có thể code bằng FXML
hoặc sử dụng JavaFX Scene Builder để tương tác và thiết kế giao diện đồ họa
người dùng. Scene Builder tạo ra các đánh dấu (markup), các đánh dấu này sau đó
có thể chuyển vào IDE các business logic
 Webview: Một thành tố của web sử dụng công nghệ WebKitHTML giúp nhúng 1
trang web trong 1 ứng dụng JavaFX. JavaScript chạy trong WebView có thể gọi đến
các JaVA API và ngược lại.
 Tương tác với Swing: Các ứng dụng được tạo bằng Swing có thể được cập nhật
thêm các tính năng của JavaFX
3|Page

 Built-in UI controls (Các thành phần tương tác giao diện tích hợp ) và CSS: JavaFX

cung cấp tất cả các UI controls thông dụng nhất giúp người dùng tạo nên một ứng
dụng hồn chỉnh. Các thành phần có thể thay đổi hình thức hiển thị thơng qua
CSS.
 Canvas API
 Hỗ trợ cảm ứng đa điểm ( Multitouch):
 Hỗ trợ HiDPI: JavaFX hỗ trợ hiển thị với độ phần giải cao
 Các phần mềm truyền thông hiệu xuất cao: Hỗ trợ xem các nội dung đã phương
tiện trên web. Nó cung cấp 1 framework truyền thông ổn định, độ trễ thấp dựa
trên GStreamer Multimedia Framework.
 Mơ hình triển khai ứng dụng độc lập: Các gói ứng dụng độc lập chứa tất cả các tài
nguyên của ứng dụng và bản sao runtimes riêng của Java và JavaFX
4.
Những gì có thể xây dựng với JavaFX
Với JavaFX, ta có thể xây dựng nhiều loại ứng dụng. Thông thương, chúng là các ứng
dụng nhận biết mạng được triển khai trên nhiều nền tảng và hiển thị thông tin trong
một giao diện người dùng hiện đại hiệu năng cao có tính năng âm thanh, video, đồ họa
và hình ảnh động.
 Các ứng dụng JavaFX
Ứng dụng mẫu

Miêu tả
JavaFX Ensemble8 là một thư viện các ứng dụng mẫu
minh họa rất nhiều các tính năng của JavaFX, bao gồm
animation, biểu đồ và điều khiển. Bạn có thể xem và
tương tác với mỗi ứng dụng mẫu đang chạy trên tất cả
các nền tảng và đọc miêu tả của nó. Trên nền tảng máy
tính, bạn có thể sao chép mã nguồn của từng mẫu, điều
chỉnh các thuộc tính của các thành phần mẫu được sử
dụng trong một vài mẫu và theo các liên kết tới tài liệu
API có liên quan khi bạn kết nối với Internet.

Modena là một ứng dụng mẫu thể hiện giao diện của các
thành phần UI sử dụng Modena theme. Nó cho phép bạn
lựa chọn đói chiếu các chủ đề của Modena và Caspian, và
khám phá các khía cạnh khác nhau của các chủ đề này.

4|Page

3DViewer là một ứng dụng mẫu cho phép bạn điều
hướng và kiểm tra một 3D scene bằng cách di chuột.
3DViewer có bộ nhập các tập hợp con các tính năng trong
OBJ và Maya files. Khả năng nhập animation cũng được
cung cấp cho các tệp Maya. 3DViewer cũng hỗ trọ việc
xuất nội dung của scene như là 1 file Java hoặc file FXML.

5|Page

Chương 2.

Cấu Trúc Ứng Dụng JavaFX

Chương trình JavaFX được phân bậc thành 3 thành tố chính: Stage, Scene và
Node. Để tạo một chương trình JavaFX ta cần import class
javafx.application.Application. Việc này cung cấp ta những phương thức trong
ứng dụng JavaFX.
o public void init();
o public abstract void start(Stage primaryStage);
o public void stop();
Để tạo ra một chương trình JavaFX cơ bản ta cần:

1. Import javafx.application.Application vào code.
2. Kế thứa Application vào class của chương trình.
3. Override phương thức start() trong class Application .

1.

STAGE

Tương tự như Frame trong Swing, nó tạo ra một phần chứa tất cả các object
trong JavaFX. Stage chính ban đầu được tạo bởi nền tảng. Các stage phát sinh
sau có thể được tạo bằng ứng dụng. Các object trong Stage chính được chuyển
tới phương thức start(). Ta cần gọi phương thức show() trong object của Stage
chính để hiện stage chính lên màn hình. Stage chính có giao diện như sau:

2.

SCENE

Scene chứa các node trong chương trình JavaFX. Javafx.scene.Scene chưa
tất cả các phương thức để sử dụng cho đối tượng trong scene. Scene
được tạo ra nhằm hình tượng hóa nội dung trong stage.

3.

SCENE GRAPH

Tồn tại ở hình thức đơn giản nhất. là tập hợp của các node. Các node là nhưng thành
phần trong stage. Nó có thể là nút, khung chữ, bố cục, hình ảnh, nút chỉnh âm thanh,
check bov, vv...

Các node được mơ tả bởi một cấu trúc hình cây. Nó bao gồm một node mẹ có vai trị là
node gốc cho các node còn lại trong scene graph.
Các node lá tồn tại ở mức thấp nhất trong cấu trúc cây. Mỗi node đại diện cho các class
trong gói javafx.scene do vậy ta cần import gói trên vào chương trình để tạo nên một
ứng dụng javafx hồn chỉnh.

Chương 3.

Các thành phần tương tác giao diện tích hợp

JavaFX cung cấp nhiều điều khiển giao diện người dùng để phát triển giao diện
người dùng toàn diện. Giao diện người dùng đồ họa (GUI) làm cho chương trình
thân thiện và dễ sử dụng. Tạo ra một GUI yêu cầu sự sáng tạo và kiến thức về
cách hoạt động của các điều khiển giao diện người dùng. Vì giao diện người
dùng kiểm soát trong JavaFX rất linh hoạt và đa năng, bạn có thể tạo ra nhiều
loại giao diện người dùng hữu ích cho các ứng dụng GUI phong phú. Oracle
cung cấp các công cụ để thiết kế và phát triển GUI một cách trực quan. Điều này
cho phép lập trình viên nhanh chóng lắp ráp các phần tử của GUI với mã hóa tối
thiểu. Các cơng cụ, tuy nhiên, khơng thể làm mọi thứ. Bạn phải sửa đổi các
chương trình mà họ sản xuất. Do đó, trước khi bạn bắt đầu để sử dụng các công
cụ trực quan, bạn phải hiểu các khái niệm cơ bản về lập trình JavaFX GUI.

1. JavaFX Container Components
1.1. Tổng quan về Container:
Sau khi xây dựng tất cả các nút cần thiết trong một cảnh, chúng ta thường sẽ sắp
xếp chúng theo thứ tự.
Sự sắp xếp này của các thành phần trong container được gọi là Layout của
container. Chúng ta cũng có thể nói rằng chúng ta đã theo một bố cục vì nó bao

gồm việc đặt tất cả các thành phần ở một vị trí cụ thể trong container.
JavaFX cung cấp một số bố cục được xác định trước như HBox, VBox, Border
Pane, Stack Pane, Text Flow, Anchor Pane, Title Pane, Grid Pane, Flow Panel,v.v.
Mỗi bố cục được đề cập ở trên được đại diện bởi một lớp và tất cả các lớp này
thuộc về gói javafx.layout. Lớp có tên Pane là lớp cơ sở của tất cả các bố cục trong
JavaFX.
Để tạo bố trí, ta cần:
-

Tạo nút.

-

Khởi tạo tương ứng bố cục được yêu cầu.

-

Đặt thuộc tính của bố trí.

-

Thêm tất cả các nút vào bố cục.

Chúng ta sẽ đề cập đến các bố cục được dùng phổ biến trong JavaFX.

1.2. Hbox và VBox:
Lớp Hbox giúp chúng ta sắp xếp các nút được thêm vào lần lượt theo một hàng dọc
duy nhất.

Tương tự như Hbox, nhưng Vbox sắp xếp các nút thành một hàng dọc.

Hbox và Vbox dùng chung nhiều phương thức:
-

setPadding(top, right, bottom, left);
Căn lề
setSpacing(distance);
Tạo khoảng cách giữa các nút

Chương trình sau đây sẽ minh họa cách tạo ra một Hbox và Vbox đơn giản:
import
import
import
import
import
import
import
import
import

javafx.application.Application;
javafx.geometry.Insets;
javafx.scene.Scene;
javafx.scene.control.Button;
javafx.scene.control.CheckBox;
javafx.scene.control.RadioButton;
javafx.scene.control.TextField;
javafx.scene.layout.HBox;

javafx.stage.Stage;

public class HBoxDemo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
HBox root = new HBox();
root.setSpacing(10);
root.setPadding(new Insets(15,20, 10,10));
// Button 1
Button button1= new Button("Button1");
root.getChildren().add(button1);
// Button 2
Button button2 = new Button("Button2");
button2.setPrefSize(100, 100);
root.getChildren().add(button2);
// TextField
TextField textField = new TextField("Text Field");
textField.setPrefWidth(110);
root.getChildren().add(textField);
// CheckBox
CheckBox checkBox = new CheckBox("Check Box");
root.getChildren().add(checkBox);
// RadioButton
RadioButton radioButton = new RadioButton("Radio Button");
root.getChildren().add(radioButton);
Scene scene = new Scene(root, 550, 250);
primaryStage.setTitle("HBox Layout Demo");
primaryStage.setScene(scene);
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}

1.3. FlowPane
Lớp FlowPane sắp xếp các nút được thêm vào trên một dòng theo thứ tự từ trái qua
phải. Trong trường hợp dòng trên đã đầy, nút kế tiếp sẽ được đẩy xuống dòng dưới.

-

Để điều chỉnh các thơng số, ta có các phương thức:
setPadding(); căn lề.
setHgap(); tạo khoảng cách giữa các thành phần cùng dịng.
setVgap(); tạo khoảng cách giữa các dịng;
Chương trình sau đây sẽ minh họa cách tạo ra một FlowPane đơn giản:
import
import
import
import
import
import
import
import
import

javafx.application.Application;
javafx.geometry.Insets;
javafx.scene.Scene;

javafx.scene.control.Button;
javafx.scene.control.CheckBox;
javafx.scene.control.RadioButton;
javafx.scene.control.TextField;
javafx.scene.layout.FlowPane;
javafx.stage.Stage;

public class FlowPaneDemo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
FlowPane root = new FlowPane();
root.setHgap(10);
root.setVgap(20);
root.setPadding(new Insets(15,15,15,15));
// Button 1
Button button1= new Button("Button1");
root.getChildren().add(button1);
// Button 2
Button button2 = new Button("Button2");
button2.setPrefSize(100, 100);
root.getChildren().add(button2);
// TextField
TextField textField = new TextField("Text Field");
textField.setPrefWidth(110);
root.getChildren().add(textField);
// CheckBox
CheckBox checkBox = new CheckBox("Check Box");
root.getChildren().add(checkBox);
// RadioButton
RadioButton radioButton = new RadioButton("Radio Button");

root.getChildren().add(radioButton);
Scene scene = new Scene(root, 550, 250);

primaryStage.setTitle("FlowPane Layout Demo");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}

1.4. GridPane:
GridPane chia bề mặt thành dạng một lưới, nút có thể nằm trong một ô của lưới hoặc
nhiều ô gần kề nhau của lưới.

-

Để điều chỉnh các thơng số, ta có các phương thức:
setPadding(); căn lề.
setHgap();
tạo khoảng cách giữa các thành phần cùng dịng.
setVgap();
tạo khoảng cách giữa các dịng;

Chương trình sau đây sẽ minh họa cách tạo ra một GridPane đơn giản:
import
import
import

import
import
import
import
import
import
import

javafx.application.Application;
javafx.geometry.HPos;
javafx.geometry.Insets;
javafx.scene.Scene;
javafx.scene.control.Button;
javafx.scene.control.Label;
javafx.scene.control.PasswordField;
javafx.scene.control.TextField;
javafx.scene.layout.GridPane;
javafx.stage.Stage;

public class GridPaneDemo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
GridPane root = new GridPane();
root.setPadding(new Insets(20));
root.setHgap(25);
root.setVgap(15);
Label labelTitle = new Label("Enter your user name and password!");
// Đặt vào ô lưới (0, 0) , bắc qua 2 cột, 1 dòng.
root.add(labelTitle, 0, 0, 2, 1);

Label labelUserName = new Label("User Name");
TextField fieldUserName = new TextField();
Label labelPassword = new Label("Password");
PasswordField fieldPassword = new PasswordField();
Button loginButton = new Button("Login");
GridPane.setHalignment(labelUserName, HPos.RIGHT);
// Đặt vào ô lưới (0,1)
root.add(labelUserName, 0, 1);
GridPane.setHalignment(labelPassword, HPos.RIGHT);
root.add(labelPassword, 0, 2);
// Căn lề trái cho User Name
GridPane.setHalignment(fieldUserName, HPos.LEFT);
root.add(fieldUserName, 1, 1);
// Căn lề trái cho trường Password
GridPane.setHalignment(fieldPassword, HPos.LEFT);
root.add(fieldPassword, 1, 2);
// Căn lề phải cho button Login.
GridPane.setHalignment(loginButton, HPos.RIGHT);
root.add(loginButton, 1, 3);
Scene scene = new Scene(root, 300, 300);
primaryStage.setTitle("GridPanel Layout Demo ");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}

1.5. AnchorPane
Các nút trong AnchorPane được neo bởi các vùng logic của AnchorPane.
Các vùng logic ở đây có thể là: lề trên dưới trái phải.
Hình sau đây minh họa cho các nút được neo bởi các lề.

Chương trình sau đây sẽ minh họa cách tạo ra một AnchorPane đơn giản:
import
import
import
import
import

javafx.application.Application;
javafx.scene.Scene;
javafx.scene.control.Button;
javafx.scene.layout.AnchorPane;
javafx.stage.Stage;

public class AnchorPaneDemo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
AnchorPane root = new AnchorPane();
Button button1 = new Button("(B1) Top + Left + Right");
Button button2 = new Button("(B2) Top + Left + Right");
Button button3 = new Button("(B3) Top + Left + Right");
Button button4 = new Button("(B4) Top + Left + Right + Bottom");
// (B1) Neo vào Top + Left + Right
AnchorPane.setTopAnchor(button1, 40.0);
AnchorPane.setLeftAnchor(button1, 50.0);

AnchorPane.setRightAnchor(button1, 70.0);
// (B2) Neo vào Top + Left + Right
AnchorPane.setTopAnchor(button2, 90.0);
AnchorPane.setLeftAnchor(button2, 10.0);
AnchorPane.setRightAnchor(button2, 320.0);
// (B3) Neo vào Top + Left + Right
AnchorPane.setTopAnchor(button3, 100.0);
AnchorPane.setLeftAnchor(button3, 250.0);
AnchorPane.setRightAnchor(button3, 20.0);
// (B4) Neo vào 4 cạnh của AnchorPane
AnchorPane.setTopAnchor(button4, 150.0);
AnchorPane.setLeftAnchor(button4, 40.0);
AnchorPane.setRightAnchor(button4, 50.0);
AnchorPane.setBottomAnchor(button4, 45.0);
// Thêm vào AnchorPane
root.getChildren().addAll(button1, button3, button2, button4);
Scene scene = new Scene(root, 550, 250);
primaryStage.setTitle("AnchorPane Layout Demo ");
primaryStage.setScene(scene);
primaryStage.show();

}
public static void main(String[] args) {
launch(args);
}
}

1.6. BorderPane
BorderPane phân chia bề mặt thành 5 vùng: top left right bottom.

Trong trường hợp có vùng bị trống, các vùng lân cận sẽ chiếm chỗ lấy vùng trống đó để
tối ưu hóa khơng gian.
Chương trình sau đây sẽ minh họa cách tạo ra một BorderPane đơn giản:
import
import
import
import
import
import
import

javafx.application.Application;
javafx.geometry.Insets;
javafx.geometry.Pos;
javafx.scene.Scene;
javafx.scene.control.Button;
javafx.scene.layout.BorderPane;
javafx.stage.Stage;

public class BorderPaneDemo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
BorderPane root = new BorderPane();
root.setPadding(new Insets(15, 20, 10, 10));
// TOP
Button btnTop = new Button("Top");
btnTop.setPadding(new Insets(10, 10, 10, 10));
root.setTop(btnTop);
// Set margin cho vùng top.

BorderPane.setMargin(btnTop, new Insets(10, 10, 10, 10));
// LEFT
Button btnLeft = new Button("Left");
btnLeft.setPadding(new Insets(5, 5, 5, 5));
root.setLeft(btnLeft);
// Set margin cho vùng left.
BorderPane.setMargin(btnLeft, new Insets(10, 10, 10, 10));
// CENTER
Button btnCenter = new Button("Center");
btnCenter.setPadding(new Insets(5, 5, 5, 5));
root.setCenter(btnCenter);

// Căn lề.
BorderPane.setAlignment(btnCenter, Pos.BOTTOM_CENTER);
// RIGHT
Button btnRight = new Button("Right");
btnRight.setPadding(new Insets(5, 5, 5, 5));
root.setRight(btnRight);
// Set margin cho vùng right.
BorderPane.setMargin(btnRight, new Insets(10, 10, 10, 10));
// BOTTOM
Button btnBottom = new Button("Bottom");
btnBottom.setPadding(new Insets(5, 5, 5, 5));
root.setBottom(btnBottom);
// Căn lề.
BorderPane.setAlignment(btnBottom, Pos.TOP_RIGHT);
// Set margin cho vùng bottom.
BorderPane.setMargin(btnBottom, new Insets(10, 10, 10, 10));
Scene scene = new Scene(root, 550, 250);

primaryStage.setTitle("BorderPane Layout Demo");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}

1.7. Dialog(hộp thoại)
Dùng để nhắc nhở cho 1 phản hồi, ví dụ như cảnh báo.
Dialog là một hộp thoại sẽ nổi lên mỗi khi cần nhắc nhở cho một phản hồi cụ thể nào
đó, hộp thoại cảnh báo là một ví dụ.
Alert dialog theo mặc định là một cửa sổ có thể thức (modelity)
là Modelity.WINDOW_MODAL. Tuy nhiên bạn có thể thay đổi bằng cách sử dụng phương
thức alert.initModality(Modality).
Mặc định cửa sổ nào mở ra một Alert sẽ là cửa sổ cha (cửa sổ sở hữu) của Alert đó.
-

Hộp thoại cảnh báo thường sẽ có 2 vùng chính:
Header Region (vùng header):
vùng này sẽ hiển thị thông báo ngắn và một icon
tượng trưng.
Content Region (vùng nội dung): vùng này sẽ chứa nội dung của cảnh báo.

1.8. ToolBar
Thanh công cụ thể hiện tường minh các chức năng mà ứng dụng có thể làm với đối
tượng mà bạn đang xử lý, điều này giúp giao diện trở nên dễ làm quen hơn với người
dùng.

1.9. ProgressBar
Thanh tiến trình mô tả tiến độ của một công việc đang được xử lý trong ứng dụng
JavaFX.

Chương trình sau đây sẽ minh họa cách tạo ra một ProgressBar đơn giản:

import
import
import
import
import
import
import

javafx.application.Application;
javafx.geometry.Insets;
javafx.scene.Scene;
javafx.scene.control.ProgressBar;
javafx.scene.control.ProgressIndicator;
javafx.scene.layout.FlowPane;
javafx.stage.Stage;

public class ProgressDemo extends Application {
@Override
public void start(Stage stage) {
ProgressBar progressBar = new ProgressBar();
ProgressIndicator progressIndicator = new ProgressIndicator();
FlowPane root = new FlowPane();

root.setPadding(new Insets(10));
root.setHgap(10);
root.getChildren().addAll(progressBar, progressIndicator);
Scene scene = new Scene(root, 400, 300);
stage.setTitle("JavaFX ProgressBar & ProgressIndicator ");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}

2. JavaFX Controller Components
1.1. Label
Label là vùng hiển thị cho một văn bản ngắn, một node hoặc cả hai. Nó thường
được sử dụng để dán nhãn những điều khiển khác (thường là text fields).

 Hàm khởi tạo (constructors):
o Label()
o Label(text: String)
o Label(text: String, graphic: Node)

 Các hàm quan trọng:
o
o
o
o
o

o
o

setAlignment(Object)
setContentDisplay(Object)
setGraphic(Object)
setGraphicTextGap(Double)
setText(String)
setUnderline(Boolean)
setWrapText(Boolean)

Chương trình sau đây sẽ minh họa cách tạo ra một Label đơn giản:
import
import
import
import
import
import
import
import
import
import
import
import

javafx.application.Application;
javafx.event.EventHandler;
javafx.geometry.Insets;
javafx.scene.Scene;
javafx.scene.control.Label;

javafx.scene.image.Image;
javafx.scene.image.ImageView;
javafx.scene.input.MouseEvent;
javafx.scene.layout.FlowPane;
javafx.scene.paint.Color;
javafx.scene.text.Font;
javafx.stage.Stage;

public class LabelFullDemo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
// Nguồn ảnh
InputStream input =
getClass().getResourceAsStream("/org/o7planning/javafx/icon/java-48.png");
Image image = new Image(input);
ImageView imageView = new ImageView(image);
// ------ Label 1 ----Label label1 = new Label("Label with Text & Icon");
// Set Image
label1.setGraphic(imageView);
// ------ Label 2 ----Label label2 = new Label("Label With Font & Color");
label2.setFont(Font.font("Cambria", 32));
label2.setTextFill(Color.web("#0076a3"));
// ------ Label 3 ----Label label3 = new Label("Long text label, wrap it!, using setWrapText(true)");
label3.setMaxWidth(100);
label3.setWrapText(true);
// ------ Label 4 ----Label label4 = new Label("Rotate 45 degrees");
// Xoay 45 độ
label4.setRotate(45);
// Di chuyển trục Y 30 pixel.
label4.setTranslateY(30);

// ------ Label 5 -----

Label label5 = new Label("Scale me!!");
label5.setOnMouseEntered(new EventHandler() {
@Override
public void handle(MouseEvent e) {
label5.setScaleX(1.5);
label5.setScaleY(1.5);
}
});
label5.setOnMouseExited(new EventHandler() {
@Override
public void handle(MouseEvent e) {
label5.setScaleX(1);
label5.setScaleY(1);
}
});
FlowPane root = new FlowPane();
root.setPadding(new Insets(10));
root.setHgap(10);
root.setVgap(10);
root.getChildren().addAll(label1, label2, label3, label4, label5);
Scene scene = new Scene(root, 400, 250);
primaryStage.setTitle("JavaFX Label (o7planning.org)");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);

}}

1.2. Button
Button là một điều khiển kích hoạt sự kiện hành động khi được nhấp vào.

 Hàm khởi tạo (constructors):
o Button();
o Button(text: String);
o Button(text: String, graphic: Node);
 Các hàm quan trọng:
o setOnAction(Object

o setAlignment(Object);
o setContentDisplay(Object);
o setGraphic(Object);
o setGraphicTextGap(Double);
o setTextFill(Object);
o setText(String);
o setUnderline(Boolean);
o setWrapText(Boolean);
Chương trình sau đây sẽ minh họa cách tạo ra một Button đơn giản:
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.effect.DropShadow;

import javafx.scene.image.Image;


import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class ButtonTest extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
// TODO Auto-generated method stub
FileInputStream input=new FileInputStream("/home/javatpoint/Desktop/JavaFX/Images/colo
red_label.png");
Image image = new Image(input);
ImageView img=new ImageView(image);
DropShadow shadow = new DropShadow();
StackPane root = new StackPane();
Button btn=new Button();
btn.setEffect(shadow);
btn.setGraphic(img);
btn.setWrapText(true);
btn.setOnAction(new EventHandler() {
@Override
public void handle(ActionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Button clicked");
}
} );
Scene scene=new Scene(root,300,300);
root.getChildren().add(btn);
primaryStage.setScene(scene);
primaryStage.setTitle("Button Class Example");
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}

1.3. CheckBox
CheckBox được sử dụng để người dùng thực hiện lựa chọn.

 Hàm khởi tạo (constructors):
o CheckBox()
o CheckBox(text: String)

 Các hàm quan trọng:
o
o
o
o
o
o
o
o

setSelected(Boolean)
setAlignment(Object)
setContentDisplay(Object)
setGraphic(Object)
setGraphicTextGap(Double)
setTextFill(Object)
setText(String)


setOnAction(Object
Chương trình sau đây sẽ minh họa cách tạo ra một CheckBox đơn giản:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class CheckBoxTest extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
// TODO Auto-generated method stub
Label l = new Label("What do you listen:
CheckBox c1 = new CheckBox("Radio one");
CheckBox c2 = new CheckBox("Radio Mirchi");
CheckBox c3 = new CheckBox("Red FM");
CheckBox c4 = new CheckBox("FM GOLD");
HBox root = new HBox();
root.getChildren().addAll(l,c1,c2,c3,c4);
root.setSpacing(5);
Scene scene=new Scene(root,800,200);
primaryStage.setScene(scene);

");


primaryStage.setTitle("CheckBox Example");
primaryStage.show();
}
}

1.4. ChoiceBox
ChoiceBox chứa một danh sách các mục từ đó người dùng có thể chọn.

 Hàm khởi tạo (constructors):
o ChoiceBox()

o ChoiceBox(items: ObservableList)
 Các hàm quan trọng:
o getSelectionModel()
o selectIndexProperty()
o addListener(changeListener)
Chương trình sau đây sẽ minh họa cách tạo ra một ChoiceBox đơn giản:
import
import
import
import
import
import
import
import
import
import
import

javafx.application.Application;


javafx.beans.value.ChangeListener;
javafx.beans.value.ObservableValue;
javafx.collections.FXCollections;
javafx.collections.ObservableList;
javafx.geometry.Insets;
javafx.scene.Scene;
javafx.scene.control.ChoiceBox;
javafx.scene.control.Label;
javafx.scene.layout.FlowPane;
javafx.stage.Stage;

public class ChoiceBoxEventDemo extends Application {
@Override
public void start(Stage primaryStage) {
Language vietnamese = new Language("vi", "Vietnamese", "Xin Chào");
Language english = new Language("en", "English", "Hello");
Language russian = new Language("ru", "Russian", "привет");
FlowPane root = new FlowPane();
Label label = new Label("Select Language:");
Label greetingLabel = new Label("");
ObservableList languages //
= FXCollections.observableArrayList(vietnamese, english, russian);
ChoiceBox choiceBox = new ChoiceBox(languages);

ChangeListener changeListener = new ChangeListener() {
@Override
public void changed(ObservableValue observable, //
Language oldValue, Language newValue) {
if (newValue != null) {


greetingLabel.setText(newValue.getGreeting());
}
}
};
// Selected Item Changed.
choiceBox.getSelectionModel().selectedItemProperty().addListener(changeListene
r);
root.setPadding(new Insets(10));
root.getChildren().addAll(label, choiceBox, greetingLabel);
root.setPadding(new Insets(10));
root.setHgap(10);
primaryStage.setTitle("ChoiceBox (o7planning.org)");
Scene scene = new Scene(root, 400, 300);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}

}

1.5. TextField
TextField có thể được sử dụng để nhập hoặc hiển thị một chuỗi

 Hàm khởi tạo (constructors):
o TextField()
o TextField(text: String)
 Các hàm quan trọng:
o


o
o
o
o
o
o
o

setAlignment(Object)
setPrefColumnCount(Integer)
setOnAction(Object

text(String)
editable(Boolean)
clear()
copy()
cut()