Tất cả các từ trong ứng dụng JavaFX có nghĩa là gì? | Trở thành lập trình viên

Sử dụng khung JavaFX, các nhà phát triển thêm các thành phần hữu ích, hấp dẫn trực quan vào các ứng dụng Java của họ. JavaFX
là một trong một số khung như vậy, bắt đầu với Bộ công cụ cửa sổ trừu
tượng vào năm 1995 và Java Swing vào năm 1998. Phiên bản đầu tiên của
JavaFX có từ năm 2008, nhưng JavaFX đã trở thành công dân hạng nhất
trong thư viện Java tiêu chuẩn với bản cập nhật thứ hai là Java 7 năm
2011.

Cũng trong năm 2011, Oracle đã phát hành Phiên bản 2 của JavaFX. Phiên
bản mới này đã kết hợp các tài liệu XML với mã Java – khai báo giao
diện của ứng dụng với XML và các hành động của ứng dụng với mã Java. JavaFX sử dụng phương ngữ riêng của ngôn ngữ XML, được gọi là FXML .

(Nếu bạn quan tâm đến nguồn gốc của từ viết tắt, XML là viết tắt của các eXtended Markup Language, và JavaFX có thể có cái gì đó để với Java “đặc biệt EFF-ECTS”. Vì vậy, tùy thuộc vào khẩu vị của bạn, FXML là viết tắt của một trong hai EFF-ECTS eXtended Markup Language hoặc Ngôn ngữ đánh dấu EFF-ECTS. Hãy lựa chọn.)

Bài viết này mô tả một số tên mà bạn tìm thấy trong một chương trình JavaFX đơn giản. (Hãy
nhớ rằng tài liệu tham khảo này về một số tên khác có nghĩa là tên của
những tên thuộc về thế giới của JavaFX, điều này không bao gồm các tên
như TextField và Nút xuất hiện trong các môi trường cửa sổ khác và nó không bao gồm các tên như java.lang và main , thuộc về công nghệ Java vanilla.)

Liệt kê 1 chứa mã FXML và Liệt kê 2 chứa mã Java. Khi bạn chạy hai danh sách này như một phần của một ứng dụng, bạn sẽ nhận được một chương trình viết hoa các chữ cái trong văn bản của bạn.

Listing 1: The Root.fxml File

<?xml version="1.0" encoding="UTF-8"?> 
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane prefHeight="130.0" prefWidth="198.0"
xmlns="http://javafx.com/javafx/8"
xmlns:fx="http://javafx.com/fxml/1"
fx:controller="application.Main">
<children>
<TextField fx:id="textField"
layoutX="25.0" layoutY="26.0" />
<Button layoutX="73.1875" layoutY="65.0"
mnemonicParsing="false"
onAction="#onClick"
text="Capitalize" />
</children>
</AnchorPane>

Listing 2: The Main.java File

package application;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
try {
Parent root = FXMLLoader.load(getClass() .getResource("Root.fxml"));
Scene scene = new Scene(root, 400, 400);
scene.getStylesheets().add( getClass().getResource("application.css") .toExternalForm());
primaryStage.setScene(scene);
primaryStage.show(); }
catch (Exception e) {
e.printStackTrace();
}
}
@FXML
private TextField textField;
@FXML
protected void onClick(ActionEvent event) { textField.setText(textField.getText().toUpperCase());
}
}

Mã FXML

Giống như mọi tài liệu XML, tài liệu trong Liệt kê 1 có một phần tử gốc – một phần tử duy nhất bắt đầu ở phần đầu của tài liệu và kết thúc ở phần cuối của tài liệu. Trong Liệt kê 1, phần tử gốc bắt đầu bằng

<AnchorPane ...

và kết thúc bằng

</AnchorPane>

Các dòng bắt đầu bằng <? (ở đầu Liệt kê 1) không được tính là các phần tử XML.

AnchorPane là một phần tử gốc

Một AnchorPane (hay chính thức hơn, một javafx.scene.layout.AnchorPane
) là một nơi mà mọi thứ có thể được neo. Hãy suy nghĩ về việc cố gắng
đặt một nút hoặc một trường văn bản trên một không gian trống lớn. Không
có AnchorPane , các thành phần này trôi nổi bên trong không gian. Với AnchorPane , bạn có thể làm cho cạnh trái của trường văn bản chính xác là 25,0 pixel từ cạnh trái của AnchorPane . (Xem thuộc tính layoutX của phần tử TextField trong Liệt kê 1.) Ngoài ra, với AnchorPane , bạn có thể làm cho cạnh trên của trường văn bản chính xác là 26,0 pixel từ cạnh trên của AnchorPane . (Xem TextFieldthuộc tính layoutY của phần tử trong Liệt kê 1.) Điều tương tự cũng đúng với một nút hoặc cho bất kỳ thành phần nào khác mà bạn trồng bên trong AnchorPane .

Bên trong phần tử gốc của tài liệu FXML, thuộc tính fx: controller cho Java biết tên của lớp trình điều khiển – lớp có mã thực hiện các hành động được liên kết với ứng dụng. Trong Liệt kê 1, tên của lớp trình điều khiển là application.Main . Và thật là một sự trùng hợp! Lớp trong Liệt kê 2 được đặt tên là Chính và nó nằm trong một gói có tên là ứng dụng !

Nếu
bạn nghĩ về mã FXML như một phác thảo, nó có một tiêu đề với các tiêu
đề phụ và với các tiêu đề phụ trong các tiêu đề phụ, v.v. Trong Liệt kê 1, tiêu đề chính là AnchorPane . Phân nhóm duy nhất của AnchorPane là trẻ em . Nhưng trẻ em có hai tiêu đề riêng của nó; cụ thể là TextField và Nút .

Thuộc tính fx: id

Phần tử TextField có thuộc tính fx: id . Thuộc tính này cho bạn biết cách tìm thành phần này bên trong một số mã Java. Nói cách khác,

<TextField fx:id="textField"

Mã Java chính, sử dụng tên textField . (Nếu bạn muốn biết thêm chi tiết, hãy xem trước cuộc thảo luận về mã trong Liệt kê 2.)

Chú ý: Bạn không phải sử dụng một từ mô tả để xác định một thành phần. Bạn có thể viết

<TextField fx:id="woofinflang"

Miễn là bạn sử dụng từ woustinflang một cách nhất quán (bằng cách tham khảo từ woustinflang trong mã Java của bạn), mọi thứ sẽ diễn ra suôn sẻ. Tất nhiên các tên như textField , textField2 và phoneNumberField có nhiều thông tin hơn các tên như woustinflang . Vì vậy, hãy tránh xa woustinflang s nếu bạn có thể.

Thuộc tính mnemonicParsing

Trong Liệt kê 1, bên trong phần tử Nút , thuộc tính mnemonicParsing có giá trị false . Giá trị sai này bảo Java không bận tâm thiết lập phím tắt cho nút. Nếu giá trị là đúng , bạn có thể thêm dấu gạch dưới vào giá trị của thuộc tính văn bản của nút :

text="_Capitalize"

Sau đó, người dùng sẽ không phải di chuyển chuột qua nút. Vì dấu gạch dưới xuất hiện ngay trước chữ C , nhấn Alt + C sẽ có tác dụng tương tự như nhấp vào nút.

Thuộc tính onAction

Thuộc tính onAction của nút cho Java biết tên của phương thức sẽ thực thi khi người dùng nhấp vào nút. Trong Liệt kê 1, onAction giá trị thuộc tính là #onClick . Điều này bảo Java gọi phương thức onClick của lớp trình điều khiển khi người dùng nhấp vào nút. May mắn thay, lớp application.Main trong Liệt kê 2 có một phương thức onClick .

Trong Liệt kê 1, onAction giá trị là #onClick . Nhưng trong Liệt kê 2, tên phương thức tương ứng là onClick mà không có ký hiệu băm. Trong thuộc tính onAction của nút , ký hiệu băm ( # ) không phải là một phần của tên phương thức. Nhưng điều đó không có nghĩa là bạn có thể bỏ qua biểu tượng băm trong tài liệu FXML của mình. Nếu bạn bỏ qua biểu tượng băm thì khi bạn cố chạy chương trình, bạn sẽ thấy một thông báo lỗi xấu.

Mã Java

Lớp trong Liệt kê 2 mở rộng lớp Ứng dụng . Một ứng dụng là chính xác những gì bạn nghĩ rằng đó là – một loạt các mã mà người dùng có thể khởi động; một chương trình với mục đích được nêu rõ ràng, như Tạo một tài liệu, Trực tiếp Lướt web Web hoặc Tìm một người bạn đời.

Chạy và khởi chạy

Có ít nhất hai cách để chạy chương trình JavaFX. Một cách là chạy nó như một ứng dụng Java thông thường. Ví dụ, trong Eclipse, bạn chọn Chạy As-> Ứng dụng Java.

Khi bạn làm điều này, máy tính của bạn khởi động máy ảo Java, lần lượt gọi phương thức chính của chương trình . Trong Liệt kê 2, phương thức chính chỉ thực hiện một câu lệnh – một cuộc gọi đến phương thức khởi chạy . Gọi phương thức khởi chạy sẽ đặt các bánh xe JavaFX của ứng dụng chạy theo chuyển động.

Ngoài ra, bạn có thể chạy mã JavaFX được đóng gói sẵn. Gói đóng gói sẵn bao gồm mọi thứ máy tính cần để chạy ứng dụng. Tất
cả mọi thứ này đều bao gồm mã để kiểm tra máy ảo Java trên máy tính của
người dùng và mã để tải xuống máy ảo Java nếu máy tính chưa có. Khi bạn đóng gói sẵn một ứng dụng JavaFX theo cách này, chương trình của bạn không cần một phương thức chính . Hệ thống tự động gọi phương thức khởi chạy của chương trình .

Một .jar tập tin giống như một .zip file, ngoại trừ việc mỗi .jar tập tin chứa các yếu tố nhất định cụ thể đối với các chương trình Java. Một trong những điều bạn có thể đặt trong tệp .jar là ứng dụng JavaFX được đóng gói sẵn.

Khi bạn gọi phương thức khởi chạy , Java sẽ trả lời bằng cách thực hiện các cuộc gọi đến các phương thức init và start của ứng dụng của bạn . Bạn không thấy một phương thức init trong Liệt kê 2 vì lớp Main của bạn kế thừa phương thức init mặc định của lớp Application . (Không sao vì phương thức init mặc định không làm gì cả.)

Những thứ bên trong những thứ khác

Các đầu phương pháp trong Liệt kê 2 tạo ra một Chánh . Các mục chính là điểm bắt đầu của một cảnh , và cảnh xuất hiện trên một sân khấu . Dưới đây là một chi tiết hơn một chút:

  • Một sân khấu là những gì bạn thường gọi là một cửa sổ.
    Đó là một khu vực làm việc hình chữ nhật trên màn hình của người dùng.
  • Một cảnh (còn được gọi là biểu đồ cảnh ) là một cây các thành phần.
    Ví dụ: Cảnh có thể chứa hai bảng. Khung ngoài cùng bên trái chứa hai tấm nhỏ hơn – khung trên cùng và khung dưới cùng. Khung trên cùng chứa một nút; khung dưới cùng chứa một trường văn bản. Khung ngoài cùng bên phải có thể chứa một hình ảnh và nhãn cho hình ảnh.
    Trong ứng dụng của bài viết này, cây các thành phần khá đơn giản. Các Scene chứa một AnchorPane mà lần lượt chứa một TextField và một nút . (Xem Liệt kê 1.)
  • Một Chánh là điểm bắt đầu cho một cảnh .
    Bất chấp những gì xuất hiện trong viên đạn trước, một Cảnh không thể bắt đầu cuộc sống của nó bằng cách có hai tấm hoặc có hai thứ. Mỗi Cảnh bắt đầu với một thành phần duy nhất và thành phần đó phải thuộc kiểu Parent . Vì vậy, trong ứng dụng của bài viết này, Cảnh chứa Cha mẹ , chứa AnchorPane , chứa TextField và Nút .

Các đầu phương pháp trong Liệt kê 2 kết nối một chuyên để các thành phần được mô tả trong Liệt kê 1, liên kết một Scene với Chánh , và sau đó liên kết một giai đoạn với Scene . Cuối cùng, mã hiển thị Giai đoạn với một cuộc gọi đến phương thức hiển thị của lớp Giai đoạn .

Nếu bạn quen thuộc với thiết kế trang web, bạn có thể sử dụng biểu định kiểu xếp tầng (CSS) để mô tả giao diện của cảnh. Trong Liệt kê 2, lệnh gọi đến cảnh.getStyleSheets (). Thêm liên kết một biểu định kiểu với cảnh của bạn. Nếu tệp .css của bạn trống (như trong ví dụ của bài viết này), thì việc gọi cảnh.getStyleSheets (). Add không có hiệu lực.

Hành động

Trong Liệt kê 1, dòng

<TextField fx:id="textField"

cung cấp cho bạn cách tham khảo một trong các thành phần trên màn hình của người dùng. Vì vậy, trong Liệt kê 2, dòng

private TextField textField;

àm cho thành phần textField này là một đối tượng trong mã Java của bạn.

Một lần nữa trong Liệt kê 1, thuộc tính onAction của nút yêu cầu Java gọi phương thức onClick của lớp trình điều khiển khi người dùng nhấp vào nút. Vì vậy, trong Liệt kê 2, phương thức onClick xử lý văn bản bên trong thành phần textField . (Cụ thể hơn, phương thức onClick lấy văn bản trong textField , viết hoa văn bản và sau đó đặt văn bản viết hoa trở lại vào textField .) Đây là cách chương trình biết phải làm gì khi người dùng nhấp vào nút.

Bạn không phải luôn luôn sử dụng các từ như textField . Bạn có thể đặt tên một cái gì đó bershmlug miễn là bạn sử dụng tên một cách nhất quán. Trong tệp FXML, bạn viết

@FXML
private TextField bershmlug;
@FXML
protected void onClick(ActionEvent event) {
bershmlug.setText(bershmlug.getText().toUpperCase());
}

Các chú thích @FXML trong Liệt kê 2 là để kiểm soát truy cập. Khi bạn chạy chương trình JavaFX, trình tải sẽ lấy mã FXML của bạn và chuyển đổi nó thành mã Java. (Nó tải dữ liệu mã FXML vào chương trình của bạn.) Để thực hiện công việc của mình, trình tải phải truy cập các tên như textField và onClick trong Liệt kê 2. Nhưng hãy nhớ: Trình tải này không phải là một phần của chương trình của riêng bạn. Trình tải thuộc về các thư viện chuẩn của Java.

Làm cách nào bạn có thể kiểm soát quyền truy cập vào tên textField và onClick ? Các công cụ sửa đổi truy cập thông thường của Java ( công khai , được bảo vệ , riêng tư và mặc định) cho bạn ít sự lựa chọn. Với các sửa đổi này, cách duy nhất để cho phép truy cập bởi một chương trình bên ngoài là khai báo textField và onClick là công khai . Nhưng, đối với nhiều nhà phát triển, việc sử dụng bừa bãi của công chúng truy cập được coi là vụng về . Với quyền truy cập công khai , mọi lớp đều có quyền truy cập vào textField và onClick. Đó không thực sự là những gì một nhà phát triển JavaFX muốn.

Để giải quyết vấn đề này, chú thích @FXML cung cấp một loại quyền truy cập đặc biệt. Trong Liệt kê 2, biến textField là riêng tư , do đó, thông thường, không có lớp nào ngoài Main có thể truy cập biến textField . Nhưng chú thích @FXML cấp đặc quyền đặc biệt cho trình tải. Không giống như bất kỳ mã nào khác, mã trình tải có thể tham chiếu biến textField . Khi bạn biên dịch và chạy chương trình của mình, Java sẽ thấy chú thích @FXML và thực hiện các thủ thuật đặc biệt để cung cấp quyền truy cập vào trình tải.

Điều tương tự cũng đúng với phương pháp onClick . Nếu không có chú thích @FXML , phương thức onClick được bảo vệ chỉ có thể được gọi từ các lớp trong gói ứng dụng của riêng bạn và từ các lớp con của lớp Chính của bạn . Trình tải không phải là những điều này. Vì vậy, để cấp quyền truy cập đặc biệt cho trình tải cho phương thức onClick của bạn , bạn mở đầu khai báo phương thức onClick của bạn bằng @FXML .

Tham khảo: Khóa học Java Fullstack

Xem thêm: CÓ NÊN học công nghệ thông tin hay không?