Ngân hàng câu hỏi của chương

Câu hỏi: HSF302 - Phần 8: Nền tảng giao diện JavaFX

23 câu trắc nghiệm kèm lời giải của môn HSF302 - Làm việc với Spring Framework, xếp theo thứ tự nhập vào ngân hàng.

Danh sách câu hỏi

20/23 câuCòn 3
ALabel
BButton
CTextField
DImageView
Lời giải
Đáp án đúng: "TextField". Trong JavaFX, TextField là control (thành phần điều khiển) cho phép người dùng gõ một dòng văn bản; chương trình đọc nội dung bằng getText() và đặt nội dung bằng setText(), còn khi cần nhập nhiều dòng thì dùng TextArea, nhập mật khẩu thì dùng PasswordField, đều là họ hàng của TextInputControl. "Label" chỉ hiển thị một đoạn chữ tĩnh, người dùng không gõ vào được, thường đặt cạnh ô nhập để làm nhãn. "Button" là nút bấm, nhận thao tác nhấn và phát ActionEvent chứ không nhận văn bản gõ vào. "ImageView" dùng để hiển thị một đối tượng Image như ảnh PNG hay JPG trên giao diện, hoàn toàn không có chức năng nhập liệu.
Mở trang câu hỏi này →
AScene scene = new Scene(new Button("Click Me"));
BStage stage = new Stage(new Button("Click Me"));
CButton button = new Button("Click Me");
DNode node = new Node(new Button("Click Me"));
Lời giải

Đáp án đúng: "Scene scene = new Scene(new Button("Click Me")); ". Trong JavaFX, Scene là vùng chứa toàn bộ đồ thị nút (scene graph) và constructor của nó nhận một Parent làm nút gốc; Button kế thừa Control, Control kế thừa Region rồi Parent, nên truyền thẳng một Button vào constructor của Scene là hợp lệ và nút đó trở thành gốc của cảnh, tức đã được đưa vào scene. "Stage stage = new Stage(new Button("Click Me")); " không biên dịch được vì Stage là cửa sổ, chỉ có constructor rỗng hoặc nhận StageStyle, và nội dung được gắn vào Stage qua setScene chứ không phải qua một nút. "Button button = new Button("Click Me"); " chỉ tạo ra đối tượng nút trong bộ nhớ, chưa gắn vào layout hay Scene nào nên chưa hiện lên màn hình. "Node node = new Node(new Button("Click Me")); " sai vì Node là lớp trừu tượng, không thể new trực tiếp và cũng không có constructor nhận một nút con.

Mở trang câu hỏi này →
A<fxml controller="MyController" />
B<fx:controller type="MyController" />
C<fx:controller fx:id="controller" value="MyController" />
D<fx:controller value="MyController" />
Lời giải

Đáp án đúng: "<fx:controller fx:id="controller" value="MyController" />". Cần nói thẳng: trong FXML thật không có phần tử nào tên fx:controller; controller được gắn bằng thuộc tính fx:controller đặt trên phần tử gốc của tệp, ví dụ <VBox fx:controller="com.foo.MyController">, rồi FXMLLoader tạo đối tượng lớp đó và tiêm các trường @FXML theo fx:id. Vì vậy cả bốn phương án đều không phải cú pháp chạy được, và đáp án ở đây được giữ theo khoá của đề chứ không có căn cứ kỹ thuật nào để xếp nó trên phương án chỉ có value: cả hai cùng mang ý khai báo lớp controller MyController qua tên fx:controller, còn thuộc tính fx:id thêm vào không đóng vai trò gì trong việc gắn controller, nó chỉ đặt định danh cho một phần tử. "<fxml controller="MyController" /> " sai vì FXML không có thẻ fxml, và controller ở đây thiếu tiền tố fx. "<fx:controller type="MyController" />" sai vì type không phải thuộc tính dùng để gắn controller. "<fx:controller value="MyController" />" cũng sai cú pháp y như vậy vì vẫn dùng một phần tử fx:controller không tồn tại.

Mở trang câu hỏi này →
ATo define database connections.
BTo initialize and show the application window.
CTo handle network requests.
DTo manage application configurations.
Lời giải
Đáp án đúng: "To initialize and show the application window.". Khi một ứng dụng JavaFX khởi chạy, runtime gọi init() rồi gọi start(Stage primaryStage) trên luồng JavaFX Application Thread, truyền vào primaryStage là cửa sổ chính do nền tảng tạo sẵn; trong start, lập trình viên dựng scene graph, gắn Scene vào Stage, đặt tiêu đề rồi gọi primaryStage.show() để cửa sổ hiện ra. "To define database connections." sai vì kết nối cơ sở dữ liệu thuộc tầng truy cập dữ liệu, không phải nhiệm vụ của phương thức vòng đời này, và mở kết nối nặng trong start còn làm treo giao diện. "To handle network requests." sai vì JavaFX không định tuyến yêu cầu mạng qua start; việc đó nên chạy trong Task hoặc luồng nền. "To manage application configurations." sai vì cấu hình thường đọc từ tệp hoặc tham số qua getParameters(), có thể làm trong init(), còn mục đích cốt lõi của start là dựng và hiển thị cửa sổ.
Mở trang câu hỏi này →
5Which method launches a JavaFX app?4 lựa chọn
Amain()
Bstart()
Claunch()
Drun()
Lời giải
Đáp án đúng: "launch()". Phương thức tĩnh Application.launch() là thứ khởi động một ứng dụng JavaFX: nó dựng runtime JavaFX, tạo một thể hiện của lớp con Application, gọi init() rồi gọi start(Stage) trên luồng JavaFX Application Thread với Stage chính đã được tạo sẵn, và chỉ trả về khi ứng dụng thoát. "main()" là điểm vào của JVM; trong ứng dụng JavaFX, main thường chỉ có một dòng gọi launch(args), tự nó không khởi động bộ công cụ đồ hoạ. "start()" là phương thức trừu tượng mà lập trình viên ghi đè để dựng Scene, nó được runtime gọi sau khi launch chạy chứ người lập trình không gọi trực tiếp để khởi động ứng dụng. "run()" là phương thức của Runnable hay Thread, dùng cho luồng thông thường hoặc Platform.runLater, không phải cách khởi chạy ứng dụng JavaFX.
Mở trang câu hỏi này →
AVBox
BFlowPane
CBorderPane
DHBox
Lời giải
Đáp án đúng: "HBox". Trong JavaFX, HBox (horizontal box) là layout pane xếp các node con thành một hàng ngang theo thứ tự thêm vào, có thể chỉnh khoảng cách bằng spacing và căn lề bằng alignment, padding. "VBox" là bản dọc tương ứng, xếp các node con thành một cột từ trên xuống dưới. "FlowPane" cũng xếp theo hàng ngang ở chế độ mặc định nhưng tự xuống dòng khi hết chiều rộng, tức bố cục chảy nhiều hàng chứ không giữ một hàng duy nhất, nên không phải layout chuyên cho một hàng ngang. "BorderPane" chia vùng thành năm khu top, bottom, left, right và center, dùng để dựng khung cửa sổ như thanh menu ở trên và nội dung ở giữa, chứ không xếp các con thành hàng.
Mở trang câu hỏi này →
7Which class loads FXML files?4 lựa chọn
AFXMLLoader
BScene
CStage
DNode
Lời giải
Đáp án đúng: "FXMLLoader". FXMLLoader đọc tệp FXML (mô tả giao diện bằng XML), dựng cây node tương ứng, tạo đối tượng controller khai báo trong fx:controller, tiêm các trường đánh dấu @FXML rồi trả về nút gốc; cách gọi thường gặp là FXMLLoader.load với URL của tệp .fxml lấy từ getClass().getResource. "Scene" là vùng chứa toàn bộ nội dung của scene graph; nó nhận nút gốc đã được nạp chứ không tự đọc FXML. "Stage" là cửa sổ cấp cao nhất chứa Scene, chỉ lo hiển thị chứ không phân tích tệp. "Node" là lớp cơ sở của mọi thành phần trong scene graph như Button, Label, Pane; kết quả của việc nạp FXML là một Node nhưng bản thân Node không có khả năng nạp tệp giao diện.
Mở trang câu hỏi này →
AEventHandler
BSceneGraph
CController
DAction
Lời giải
Đáp án đúng: "EventHandler". Trong JavaFX, interface EventHandler có phương thức handle nhận đối tượng sự kiện và chính kiểu này nhận và xử lý sự kiện người dùng, ví dụ setOnAction trên một nút là gắn một EventHandler cho ActionEvent, còn setOnKeyPressed gắn một EventHandler cho KeyEvent. "Controller" là chỗ dễ nhầm: lớp controller của FXML đúng là nơi viết các phương thức xử lý như onSaveClick, nhưng nó chỉ là lớp chứa mã, còn khi FXMLLoader nối thuộc tính onAction tới phương thức đó thì thứ được gắn lên control vẫn là một EventHandler, nên kiểu trực tiếp nhận và xử lý sự kiện là EventHandler. "SceneGraph" là cây các Node tạo nên giao diện, sự kiện đi qua cây này nhưng nó không xử lý sự kiện. "Action" không phải một kiểu xử lý trong JavaFX; thứ gần nhất là ActionEvent, tức đối tượng mô tả sự kiện, không phải bộ xử lý.
Mở trang câu hỏi này →
9Which CSS file customizes JavaFX UI?4 lựa chọn
Astyles.css
Bui.css
Cdesign.css
Dtheme.xml
Lời giải
Đáp án đúng: "styles.css". JavaFX cho phép định kiểu giao diện bằng CSS: ta nạp tệp bằng scene.getStylesheets().add(...) hoặc khai báo stylesheets trong FXML, rồi viết bộ chọn như .button với thuộc tính có tiền tố -fx-. Cần nói thẳng là JavaFX không bắt buộc tên tệp nào; giao diện mặc định lấy từ stylesheet nội bộ modena.css, còn styles.css chỉ là tên quen dùng mà các mẫu dự án tạo sẵn, nên đây là đáp án được chọn theo thông lệ. Theo đúng kỹ thuật, "ui.css" hay "design.css" vẫn hoạt động y hệt nếu được nạp vào Scene, chúng chỉ không phải tên thông dụng mà câu hỏi muốn nhắc tới. Riêng "theme.xml" sai hẳn vì đó là tệp XML, không phải CSS, và JavaFX không đọc định kiểu giao diện từ XML.
Mở trang câu hỏi này →
AStage
BNode
CPane
DScene
Lời giải
Đáp án đúng: "Scene". JavaFX dùng hình ảnh sân khấu: Stage là cửa sổ, Scene là nội dung đặt trong cửa sổ đó, chứa đồ thị cảnh (scene graph) gồm một node gốc và mọi node con; gọi stage.setScene(scene) để hiển thị vùng nội dung này, và đổi Scene là đổi toàn bộ nội dung cửa sổ. "Stage" là chính cửa sổ cấp cao nhất với thanh tiêu đề, kích thước, nút đóng, không phải vùng nội dung bên trong. "Node" là lớp cơ sở của mọi phần tử trong đồ thị cảnh như Button hay Label, chỉ là một mảnh của nội dung. "Pane" là một layout chứa node con, thường làm node gốc của Scene, nhưng nó chỉ là một phần trong vùng nội dung, chưa phải lớp đại diện cho vùng nội dung của cửa sổ.
Mở trang câu hỏi này →
ALabel
BButton
CTextField
DImageView
Lời giải
Đáp án đúng: "ImageView". Trong JavaFX, ImageView là Node dùng để hiển thị một đối tượng Image đã nạp từ tệp hoặc URL, ví dụ new ImageView(new Image("logo.png")), và cho phép chỉnh kích thước bằng setFitWidth, setFitHeight hay giữ tỉ lệ bằng setPreserveRatio; Image chứa dữ liệu ảnh, còn ImageView là thứ vẽ nó lên Scene. "Label" dùng để hiển thị chữ, tuy có thể gắn kèm một graphic nhưng vai trò chính vẫn là nhãn văn bản và graphic đó thường lại chính là một ImageView. "Button" là nút bấm nhận thao tác nhấn và phát ActionEvent. "TextField" là ô cho người dùng gõ một dòng văn bản, không có chức năng hiển thị ảnh.
Mở trang câu hỏi này →
AGridPane
BBorderPane
CVBox
DHBox
Lời giải
Đáp án đúng: "BorderPane". BorderPane là layout của JavaFX chia vùng chứa thành năm khu vực theo các cạnh: top, bottom, left, right và center, đặt nút bằng setTop, setBottom, setLeft, setRight, setCenter; vùng center chiếm phần diện tích còn lại, rất hợp cho bố cục cửa sổ có thanh menu ở trên, thanh trạng thái ở dưới và nội dung chính ở giữa. "GridPane" sắp nút theo lưới hàng và cột, định vị bằng chỉ số hàng cột chứ không theo vùng biên. "VBox" xếp các nút con thành một cột dọc từ trên xuống. "HBox" xếp các nút con thành một hàng ngang từ trái sang phải. Cả GridPane, VBox lẫn HBox đều không có khái niệm các vùng biên của cửa sổ, muốn có bố cục như vậy phải lồng nhiều layout.
Mở trang câu hỏi này →
AStackPane
BBorderPane
CHBox
DVBox
Lời giải
Đáp án đúng: "BorderPane". Yêu cầu chia cửa sổ thành top, bottom, center, left và right khớp đúng năm vùng của BorderPane: mỗi vùng giữ tối đa một nút, gán bằng setTop, setBottom, setLeft, setRight, setCenter; vùng trên và dưới kéo hết chiều ngang, vùng trái phải lấy theo chiều rộng ưa thích của nút, còn center giãn ra lấp phần còn lại khi cửa sổ đổi kích thước. "StackPane" chồng các nút con lên nhau tại cùng một vị trí, mặc định căn giữa, hợp với việc đặt chữ lên ảnh nền chứ không chia vùng. "HBox" chỉ xếp các nút theo một hàng ngang. "VBox" chỉ xếp các nút theo một cột dọc. Muốn có năm vùng bằng HBox hay VBox phải lồng nhiều layout, trong khi BorderPane làm sẵn việc đó.
Mở trang câu hỏi này →
AStage
BScene
CNode
DPane
Lời giải
Đáp án đúng: "Scene". Trong JavaFX, Scene là vùng chứa toàn bộ nội dung của scene graph (đồ thị cảnh): nó giữ một nút gốc, thường là một Pane, và mọi Button, Label, hình vẽ đều nằm dưới nút gốc đó. "Stage" là cửa sổ cấp cao nhất do hệ điều hành cung cấp; nó bao ngoài và chứa Scene qua setScene chứ không trực tiếp chứa các nút giao diện, đổi Scene là đổi toàn bộ nội dung trong cùng một cửa sổ. "Node" là lớp cơ sở của từng phần tử trong scene graph, mỗi node chỉ là một mảnh nội dung chứ không phải vùng chứa tất cả. "Pane" là một node bố cục có thể chứa các node con và hay được dùng làm nút gốc, nhưng nó chỉ chứa phần nội dung đặt trong nó và bản thân vẫn phải nằm trong một Scene mới hiển thị được.
Mở trang câu hỏi này →
A@FXML
B@Bind
C@UI
D@Node
Lời giải
Đáp án đúng: "@FXML". Khi FXMLLoader nạp tệp FXML, nó tạo controller được chỉ định bằng fx:controller rồi tiêm các nút có fx:id vào trường cùng tên trong controller; trường hoặc phương thức xử lý sự kiện không public phải gắn @FXML thì loader mới truy cập được, ví dụ trường nameField kiểu TextField và phương thức handleSave được gọi từ thuộc tính onAction trong FXML. Như vậy @FXML là cầu nối giữa phần tử khai báo trong FXML và mã Java. "@Bind" không phải annotation của JavaFX; ràng buộc dữ liệu trong JavaFX làm bằng phương thức bind trên property. "@UI" không tồn tại trong API JavaFX. "@Node" cũng không phải annotation; Node là lớp cơ sở của mọi phần tử trong scene graph chứ không dùng để đánh dấu trường.
Mở trang câu hỏi này →
ABackground thread management
BWeb API development
CDesktop GUI development
DDatabase access
Lời giải
Đáp án đúng: "Desktop GUI development". JavaFX là bộ công cụ của Java để xây dựng giao diện đồ hoạ cho ứng dụng desktop: nó cung cấp Stage, Scene, cây Node với các control như Button, TextField, TableView, bố cục như GridPane, VBox, hỗ trợ FXML để tách giao diện khỏi mã, định dạng bằng CSS, hiệu ứng và đồ hoạ; nó là bản kế nhiệm Swing. "Background thread management" không phải mục đích chính, JavaFX chỉ có lớp hỗ trợ như Task và Service để chạy việc nền mà không làm treo giao diện, còn quản lý luồng nói chung thuộc java.util.concurrent. "Web API development" là phạm vi của Spring MVC hay Jakarta REST. "Database access" do JDBC, JPA hoặc Spring Data đảm nhận, JavaFX chỉ hiển thị dữ liệu.
Mở trang câu hỏi này →
ALabel
BButton
CTextField
DImageView
Lời giải
Đáp án đúng: "Label". Trong JavaFX, Label là control dùng để hiển thị một đoạn văn bản không chỉnh sửa được, như tiêu đề hay nhãn đặt cạnh ô nhập; nội dung đặt bằng setText() hoặc thuộc tính text trong FXML, có thể kèm một graphic. Người dùng chỉ đọc chứ không gõ vào Label. "Button" cũng mang chữ trên mặt nút, nhưng vai trò của nó là nhận thao tác nhấn và phát ActionEvent, không phải để hiển thị văn bản. "TextField" là ô nhập một dòng, dùng để người dùng gõ văn bản vào và chương trình đọc lại bằng getText(). "ImageView" dùng để hiển thị ảnh từ đối tượng Image chứ không hiển thị chữ.
Mở trang câu hỏi này →
ATo manage database connections.
BTo respond to user interactions.
CTo handle network requests.
DTo manage application configurations.
Lời giải
Đáp án đúng: "To respond to user interactions.". Ứng dụng JavaFX chạy theo hướng sự kiện: khi người dùng bấm nút, gõ phím, di chuột hay đóng cửa sổ, JavaFX tạo đối tượng sự kiện như ActionEvent, KeyEvent, MouseEvent rồi chuyển qua chuỗi điều phối tới nút đích, nơi các handler đăng ký bằng setOnAction, addEventHandler hoặc thuộc tính onAction trong FXML được gọi trên JavaFX Application Thread để phản hồi, như kiểm tra form rồi lưu dữ liệu. "To manage database connections." là việc của JDBC, bể kết nối hay EntityManagerFactory, không phải của cơ chế sự kiện. "To handle network requests." thuộc các API mạng như HttpClient, nên chạy ở luồng nền để không làm treo giao diện. "To manage application configurations." là việc của tệp properties hay Preferences, không liên quan tới xử lý thao tác người dùng.
Mở trang câu hỏi này →
19In JavaFX, what is a Property?4 lựa chọn
AA static variable.
BA dynamic, observable value.
CA database field.
DA network address.
Lời giải
Đáp án đúng: "A dynamic, observable value.". Trong JavaFX, property như StringProperty, IntegerProperty hay ObjectProperty là đối tượng bọc một giá trị có thể thay đổi và cho phép đăng ký listener (ChangeListener, InvalidationListener) để được báo khi giá trị đổi; nhờ tính quan sát được (observable) đó mà có binding, ví dụ label.textProperty().bind(nameProperty) giúp giao diện tự cập nhật theo dữ liệu. "A static variable." sai vì property thường là thành viên của từng đối tượng, và quan trọng hơn là nó phát thông báo khi thay đổi, điều một biến static thông thường không làm. "A database field." sai vì property là khái niệm của tầng giao diện, có thể được nạp từ một cột nhưng bản thân không gắn với cơ sở dữ liệu. "A network address." sai vì property không liên quan gì tới mạng.
Mở trang câu hỏi này →
20In JavaFX, consider:4 lựa chọncó code
Đề bài
Button btn = new Button("Click");
btn.setOnAction(e -> System.out.println("Pressed"));

What happens when user clicks the button?

ANothing
BCompilation error
CText 'Pressed' is printed in console
DButton disappears
Lời giải
Đáp án đúng: "Text 'Pressed' is printed in console". Lần theo mã: dòng đầu tạo Button có nhãn Click; dòng hai gọi setOnAction với một biểu thức lambda, đăng ký trình xử lý cho sự kiện ActionEvent. Khi người dùng bấm nút (giả sử nút đã nằm trong Scene đang hiển thị), JavaFX phát ActionEvent và gọi lambda trên luồng JavaFX Application Thread, lệnh System.out.println ghi chữ Pressed ra console, còn nút vẫn giữ nguyên trên giao diện. "Nothing" sai vì trình xử lý đã được gắn nên lần bấm có hiệu ứng. "Compilation error" sai vì lambda nhận tham số e và gọi println khớp đúng interface EventHandler cho ActionEvent, biên dịch bình thường. "Button disappears" sai vì không có dòng nào gọi setVisible(false) hay gỡ nút khỏi layout.
Mở trang câu hỏi này →