Search

Controller

Controller

JavaFX์—์„œ FXML๋กœ ์„ค๊ณ„๋œ UI์™€ Java ์ฝ”๋“œ(๋กœ์ง)๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ(๋ฒ„ํŠผ ํด๋ฆญ, ํ…์ŠคํŠธ ์ž…๋ ฅ ๋“ฑ)์„ ์ฒ˜๋ฆฌํ•˜๊ณ , UI ์š”์†Œ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

JavaFX ์ปจํŠธ๋กค๋Ÿฌ๋Š” UI์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ(๋ฒ„ํŠผ ํด๋ฆญ, ํ‚ค ์ž…๋ ฅ ๋“ฑ)๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ์ด๋ฒคํŠธ ์ข…๋ฅ˜

์ด๋ฒคํŠธ ํƒ€์ž…
์„ค๋ช…
onAction
๋ฒ„ํŠผ ํด๋ฆญ, ๋ฉ”๋‰ด ์„ ํƒ ๋“ฑ์˜ ์•ก์…˜ ์ฒ˜๋ฆฌ
onMouseClicked
๋งˆ์šฐ์Šค ํด๋ฆญ ์ด๋ฒคํŠธ
onKeyPressed
ํ‚ค๋ณด๋“œ ์ž…๋ ฅ ๊ฐ์ง€
onMouseEntered
๋งˆ์šฐ์Šค๊ฐ€ ์ปจํŠธ๋กค์— ๋“ค์–ด์™”์„ ๋•Œ
onMouseExited
๋งˆ์šฐ์Šค๊ฐ€ ์ปจํŠธ๋กค์„ ๋– ๋‚  ๋•Œ

FXML์—์„œ Controller ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

FXML์—์„œ ํŠน์ • Java ํด๋ž˜์Šค๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• ์„ ํ•˜๋„๋ก ์ง€์ •ํ•˜๋ ค๋ฉด fx:controller ์†์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
1.
๋ ˆ์ด์•„์›ƒ ์š”์†Œ์— fx:controller ์†์„ฑ์„ ์ž‘์„ฑ
2.
fx:controller ์†์„ฑ ๊ฐ’์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ์ง€์ •
<Layout fx:controller="application.MainController"></Layout>
Java
๋ณต์‚ฌ

FXML์—์„œ Controller ์ง€์ •

<?xml version="1.0" encoding="UTF-8"?> <VBox xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.MyController"> <Label fx:id="label" text="Hello, JavaFX!"/> <Button text="ํด๋ฆญ" onAction="#handleButtonClick"/> </VBox>
XML
๋ณต์‚ฌ
fx:controller="com.example.MyController"
โ†’ com.example.MyController ํด๋ž˜์Šค๊ฐ€ ์ด FXML์˜ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• ์„ ํ•จ.

Controller์—์„œ ์ด๋ฒคํŠธ์™€ ๋ฉ”์†Œ๋“œ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•

FXML ํŒŒ์ผ์—์„œ ํŠน์ • ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ง€์ •ํ•œ ๋’ค, ์ปจํŠธ๋กค ์š”์†Œ์˜ ์ด๋ฒคํŠธ ์†์„ฑ์— ๋ฉ”์†Œ๋“œ๋ฅผ #method ํ˜•ํƒœ๋กœ ์ง€์ •ํ•˜๊ณ , @FXML ์–ด๋…ธํ…Œ์ด์…˜์„ ์—ฐ๊ฒฐ๋  ๋ฉ”์†Œ๋“œ์— ๋ถ™์—ฌ์ค€๋‹ค.
1.
FXML ๋ ˆ์ด์•„์›ƒ ์š”์†Œ์— ์ปจํŠธ๋กค๋Ÿฌ ์ง€์ •
2.
ํŠน์ • ์ปจํŠธ๋กค ์š”์†Œ์— ์ด๋ฒคํŠธ ์†์„ฑ์— #method ํ˜•ํƒœ๋กœ ๋ฉ”์†Œ๋“œ๋ช… ์ง€์ •
3.
๋ฉ”์†Œ๋“œ์— @FXML ์–ด๋…ธํ…Œ์ด์…˜ ์ง€์ •
FXML ๋ ˆ์ด์•„์›ƒ ์š”์†Œ์— ์ปจํŠธ๋กค๋Ÿฌ ์ง€์ •
<Layout fx:controller="application.MainController"></Layout>
Java
๋ณต์‚ฌ
์ปจํŠธ๋กค ์š”์†Œ ๋ฉ”์†Œ๋“œ ์ง€์ •
<Button onAction="#clickButton">๋ฒ„ํŠผ</Button>
Java
๋ณต์‚ฌ
๋ฉ”์†Œ๋“œ์— @FXML ์–ด๋…ธํ…Œ์ด์…˜ ์ง€์ •
@FXML public void clickButton(ActionEvent event) throws IOException { System.out.println("๋ฒ„ํŠผ ํด๋ฆญ!"); }
Java
๋ณต์‚ฌ

@FXML์„ ์‚ฌ์šฉํ•˜์—ฌ FXML์˜ UI ์š”์†Œ๋ฅผ Java ๊ฐ์ฒด ์„ ์–ธ

package com.example; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.Label; public class MyController { @FXML private Label label; // FXML์—์„œ fx:id="label"์ธ ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ @FXML private Button button; // ๋ฒ„ํŠผ ๊ฐ€์ ธ์˜ค๊ธฐ @FXML private void handleButtonClick() { // ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ label.setText("๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!"); } }
Java
๋ณต์‚ฌ
@FXML์„ ์‚ฌ์šฉํ•˜์—ฌ FXML์—์„œ ์„ ์–ธ๋œ ์š”์†Œ๋ฅผ Java ์ฝ”๋“œ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ.
handleButtonClick() ๋ฉ”์„œ๋“œ๋Š” FXML ๋ฒ„ํŠผ์˜ onAction="#handleButtonClick"๊ณผ ์—ฐ๊ฒฐ๋จ.

์˜ˆ์ œ ์ฝ”๋“œ

(1) ๋กœ๊ทธ์ธ ํ™”๋ฉด (login.fxml + LoginController.java)

[FXML - login.fxml]

<?xml version="1.0" encoding="UTF-8"?> <VBox xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.LoginController" alignment="CENTER" spacing="10"> <Label text="๋กœ๊ทธ์ธ"/> <TextField fx:id="usernameField" promptText="์•„์ด๋”” ์ž…๋ ฅ"/> <PasswordField fx:id="passwordField" promptText="๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ"/> <Button text="๋กœ๊ทธ์ธ" onAction="#handleLogin"/> <Label fx:id="messageLabel" text="" style="-fx-text-fill: red;"/> </VBox>
XML
๋ณต์‚ฌ

[Controller - LoginController.java]

package com.example; import javafx.fxml.FXML; import javafx.scene.control.Label; import javafx.scene.control.PasswordField; import javafx.scene.control.TextField; public class LoginController { @FXML private TextField usernameField; @FXML private PasswordField passwordField; @FXML private Label messageLabel; @FXML private void handleLogin() { String username = usernameField.getText(); String password = passwordField.getText(); if ("admin".equals(username) && "1234".equals(password)) { messageLabel.setText("๋กœ๊ทธ์ธ ์„ฑ๊ณต!"); messageLabel.setStyle("-fx-text-fill: green;"); } else { messageLabel.setText("์•„์ด๋”” ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค."); } } }
Java
๋ณต์‚ฌ
๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด handleLogin() ์‹คํ–‰ โ†’ ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฒ€์ฆ ํ›„ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ.

(2) ๊ฒŒ์‹œํŒ ๋ชฉ๋ก (board.fxml + BoardController.java)

[FXML - board.fxml]

<?xml version="1.0" encoding="UTF-8"?> <BorderPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.BoardController"> <top> <Label text="๊ฒŒ์‹œํŒ ๋ชฉ๋ก" style="-fx-font-size: 16px;"/> </top> <center> <TableView fx:id="boardTable"> <columns> <TableColumn text="๋ฒˆํ˜ธ" fx:id="colId"/> <TableColumn text="์ œ๋ชฉ" fx:id="colTitle"/> <TableColumn text="์ž‘์„ฑ์ž" fx:id="colAuthor"/> <TableColumn text="๋‚ ์งœ" fx:id="colDate"/> </columns> </TableView> </center> <bottom> <HBox alignment="CENTER" spacing="10"> <Button text="์ƒˆ ๊ธ€ ์ž‘์„ฑ" onAction="#handleNewPost"/> </HBox> </bottom> </BorderPane>
XML
๋ณต์‚ฌ

[Controller - BoardController.java]

package com.example; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.Button; import javafx.scene.control.cell.PropertyValueFactory; public class BoardController { @FXML private TableView<Post> boardTable; @FXML private TableColumn<Post, Integer> colId; @FXML private TableColumn<Post, String> colTitle; @FXML private TableColumn<Post, String> colAuthor; @FXML private TableColumn<Post, String> colDate; @FXML private Button newPostButton; private final ObservableList<Post> posts = FXCollections.observableArrayList(); @FXML private void initialize() { colId.setCellValueFactory(new PropertyValueFactory<>("id")); colTitle.setCellValueFactory(new PropertyValueFactory<>("title")); colAuthor.setCellValueFactory(new PropertyValueFactory<>("author")); colDate.setCellValueFactory(new PropertyValueFactory<>("date")); boardTable.setItems(posts); } @FXML private void handleNewPost() { posts.add(new Post(posts.size() + 1, "์ƒˆ๋กœ์šด ๊ฒŒ์‹œ๊ธ€", "๊ด€๋ฆฌ์ž", "2025-04-03")); } }
Java
๋ณต์‚ฌ

[Post.java (๋ฐ์ดํ„ฐ ๋ชจ๋ธ ํด๋ž˜์Šค)]

package com.example; public class Post { private final int id; private final String title; private final String author; private final String date; public Post(int id, String title, String author, String date) { this.id = id; this.title = title; this.author = author; this.date = date; } public int getId() { return id; } public String getTitle() { return title; } public String getAuthor() { return author; } public String getDate() { return date; } }
Java
๋ณต์‚ฌ
initialize()์—์„œ TableView ์ปฌ๋Ÿผ์„ ์„ค์ •ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™”.
handleNewPost() ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ƒˆ๋กœ์šด ๊ฒŒ์‹œ๊ธ€ ์ถ”๊ฐ€.

์ •๋ฆฌ

โ€ข
FXML์—์„œ fx:controller ์†์„ฑ์œผ๋กœ Java ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์—ฐ๊ฒฐ.
โ€ข
@FXML์„ ์ด์šฉํ•ด UI ์š”์†Œ๋ฅผ Java ์ฝ”๋“œ์—์„œ ์ œ์–ด.
โ€ข
๋ฒ„ํŠผ ํด๋ฆญ ๋“ฑ์˜ ์ด๋ฒคํŠธ๋ฅผ Java ๋ฉ”์„œ๋“œ(onAction="#methodName")์™€ ์—ฐ๊ฒฐ.
โ€ข
initialize() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ดˆ๊ธฐ UI ์„ค์ •.
์ด์ œ JavaFX์˜ MVC ๊ตฌ์กฐ์—์„œ FXML๊ณผ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ UI์™€ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!