Search

CSS

JavaFX CSS

JavaFX CSS

JavaFX CSS๋Š” UI ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ชจ์–‘๊ณผ ์Šคํƒ€์ผ์„ ์ •์˜ํ•˜๋Š” ์–ธ์–ด๋กœ, HTML์˜ CSS์ฒ˜๋Ÿผ Scene๊ณผ Node์— ์ƒ‰์ƒ, ๊ธ€๊ผด, ์—ฌ๋ฐฑ, ํšจ๊ณผ ๋“ฑ์„ ์ง€์ •ํ•ด ์ผ๊ด€๋œ ๋””์ž์ธ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

CSS ๋ž€?

CSS(Cascading Style Sheets)๋Š” ์›น ํŽ˜์ด์ง€๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ UI ์š”์†Œ์— ์ƒ‰์ƒ, ๊ธ€๊ผด, ๋ ˆ์ด์•„์›ƒ, ๊ฐ„๊ฒฉ ๋“ฑ ์‹œ๊ฐ์  ์Šคํƒ€์ผ์„ ์ •์˜ํ•˜๋Š” ์Šคํƒ€์ผ์‹œํŠธ ์–ธ์–ด๋กœ, HTML์ด๋‚˜ JavaFX ๊ฐ™์€ ๋งˆํฌ์—… ๊ตฌ์กฐ์™€ ๋””์ž์ธ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ผ๊ด€๋˜๊ณ  ํšจ์œจ์ ์ธ UI ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

Java FX CSS ๋ฌธ๋ฒ•

JavaFX CSS ๋ฌธ๋ฒ• ๊ธฐ๋ณธ

JavaFX CSS๋Š” ์›น CSS์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋ชจ๋“  ์†์„ฑ๋ช… ์•ž์— -fx- ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.

-fx- ์ ‘๋‘์‚ฌ๋ž€?

โ€ข
JavaFX ์ „์šฉ CSS ์†์„ฑ์ž„์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ ‘๋‘์‚ฌ
โ€ข
์›น CSS์˜ background-color๋Š” JavaFX์—์„œ -fx-background-color๋กœ ์‚ฌ์šฉ
โ€ข
ํ‘œ์ค€ CSS์™€ ๊ตฌ๋ถ„ํ•˜์—ฌ JavaFX Scene Graph์—๋งŒ ์ ์šฉ๋˜๋„๋ก ์„ค๊ณ„๋จ

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” -fx- ์†์„ฑ

์†์„ฑ๋ช…
์„ค๋ช…
์˜ˆ์‹œ
-fx-background-color
๋ฐฐ๊ฒฝ ์ƒ‰์ƒ
#4CAF50,red
-fx-text-fill
ํ…์ŠคํŠธ ์ƒ‰์ƒ
white,#333
-fx-font-size
๊ธ€๊ผด ํฌ๊ธฐ
14px,1.2em
-fx-font-family
๊ธ€๊ผด ์ข…๋ฅ˜
"Nanum Gothic"
-fx-padding
๋‚ด๋ถ€ ์—ฌ๋ฐฑ
10px,5 10 15 20
-fx-border-color
ํ…Œ๋‘๋ฆฌ ์ƒ‰์ƒ
black
-fx-border-width
ํ…Œ๋‘๋ฆฌ ๋‘๊ป˜
2px
-fx-background-radius
๋ชจ์„œ๋ฆฌ ๋‘ฅ๊ธ€๊ฒŒ
8px
-fx-effect
๊ทธ๋ฆผ์ž ๋“ฑ ํšจ๊ณผ
dropshadow(...)

์˜ˆ์‹œ ์ฝ”๋“œ

/* ID ์„ ํƒ์ž */ #mainButton { -fx-background-color: #2196F3; -fx-text-fill: white; -fx-font-size: 16px; -fx-padding: 10px 20px; -fx-background-radius: 5px; } /* ํด๋ž˜์Šค ์„ ํƒ์ž */ .primary-button { -fx-background-color: linear-gradient(#61a2b1, #2A5058); -fx-text-fill: white; -fx-font-weight: bold; } /* ๋…ธ๋“œ ์„ ํƒ์ž */ Label { -fx-text-fill: #333333; -fx-font-family: "Malgun Gothic"; }
CSS
๋ณต์‚ฌ
ํ•ต์‹ฌ ์š”์•ฝ: JavaFX CSS๋Š” ์ผ๋ฐ˜ CSS์™€ ๋ฌธ๋ฒ•์ด ๋น„์Šทํ•˜์ง€๋งŒ, ๋ชจ๋“  ์†์„ฑ ์•ž์— -fx-๋ฅผ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๋ฐ˜๋“œ์‹œ ๊ธฐ์–ตํ•ด์•ผ ํ•œ๋‹ค.

JavaFX์—์„œ CSS์˜ ์—ญํ• 

โ€ข
JavaFX๋Š” HTML/CSS ๊ธฐ๋ฐ˜ ์›น ์Šคํƒ€์ผ๋ง ๊ฐœ๋…์„ GUI์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Œ.
โ€ข
Scene, Node(Label, Button, Pane ๋“ฑ)์— ์Šคํƒ€์ผ ์ ์šฉ ๊ฐ€๋Šฅ.
โ€ข
.css ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ ๋ฆฌ์†Œ์Šค ํด๋”(resources)์— ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ.

CSS ์ ์šฉ ๋ฐฉ๋ฒ• 3๊ฐ€์ง€

โ€ข
์ธ๋ผ์ธ ์Šคํƒ€์ผ
โ€ข
Scene ๋‹จ์œ„ CSS ์ ์šฉ
โ€ข
FXML ๋‚ด CSS ์ง€์ •

(1) ์ธ๋ผ์ธ ์Šคํƒ€์ผ

button.setStyle("-fx-background-color: #4CAF50; -fx-text-fill: white;");
Java
๋ณต์‚ฌ
โ€ข
๊ฐ„๋‹จํ•˜์ง€๋งŒ ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€ โ†’ ์ž‘์€ ํ”„๋กœ์ ํŠธ์—๋งŒ ์ ํ•ฉ.

(2) Scene ๋‹จ์œ„ CSS ์ ์šฉ

Scene scene = new Scene(root); scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm()); stage.setScene(scene);
Java
๋ณต์‚ฌ
โ€ข
๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์ข‹์Œ.
โ€ข
ํ•˜๋‚˜์˜ Scene ์ „์ฒด์— CSS ์ผ๊ด„ ์ ์šฉ.

(3) FXML ๋‚ด CSS ์ง€์ •

<AnchorPane stylesheets="@style.css"> <Button text="ํด๋ฆญ" styleClass="main-button"/> </AnchorPane>
XML
๋ณต์‚ฌ
โ€ข
FXML ๊ธฐ๋ฐ˜ UI์—์„œ ์†์‰ฝ๊ฒŒ ์Šคํƒ€์ผ ์ ์šฉ ๊ฐ€๋Šฅ.

CSS ์„ ํƒ์ž ๊ธฐ์ดˆ

๊ตฌ๋ถ„
์˜ˆ์‹œ
์„ค๋ช…
ID ์„ ํƒ์ž
#mainPane
setId("mainPane")๋กœ ์ง€์ •ํ•œ ๋…ธ๋“œ ๋Œ€์ƒ
ํด๋ž˜์Šค ์„ ํƒ์ž
.main-button
getStyleClass().add("main-button")
๋…ธ๋“œ ์„ ํƒ์ž
Button
๋ชจ๋“  ๋ฒ„ํŠผ์— ๊ณตํ†ต ์ ์šฉ

CSS ์†์„ฑ ์˜ˆ์‹œ

.root { -fx-font-family: "Nanum Gothic"; -fx-font-size: 14px; } .button { -fx-background-color: linear-gradient(#6db3f2, #1e69de); -fx-text-fill: white; -fx-background-radius: 8; }
CSS
๋ณต์‚ฌ

์‹ค์Šต

1.
style.css ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ  Scene์— ์ ์šฉํ•ด๋ณด๊ธฐ
2.
๋ฒ„ํŠผ hover ์‹œ ์ƒ‰์ƒ ๋ณ€๊ฒฝ ํšจ๊ณผ ์ถ”๊ฐ€
3.
ID/Class ๊ธฐ๋ฐ˜์œผ๋กœ ์„ ํƒ์ž ์ง€์ •ํ•ด๋ณด๊ธฐ

์‹ค์Šต 1: style.css ํŒŒ์ผ ์ž‘์„ฑ ๋ฐ Scene ์ ์šฉ

1) style.css ํŒŒ์ผ ์ƒ์„ฑ
ํ”„๋กœ์ ํŠธ์˜ src/main/resources ํด๋”์— style.css ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
/* style.css */ .root { -fx-font-family: "Malgun Gothic"; -fx-font-size: 14px; -fx-background-color: #f5f5f5; } .main-button { -fx-background-color: #4CAF50; -fx-text-fill: white; -fx-font-size: 16px; -fx-padding: 10px 20px; -fx-background-radius: 5px; -fx-cursor: hand; } #titleLabel { -fx-font-size: 24px; -fx-font-weight: bold; -fx-text-fill: #333333; }
CSS
๋ณต์‚ฌ
2) Java ์ฝ”๋“œ์—์„œ CSS ์ ์šฉ
import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class CSSExample extends Application { @Override public void start(Stage stage) { Label label = new Label("JavaFX CSS ์‹ค์Šต"); label.setId("titleLabel"); Button button = new Button("ํด๋ฆญํ•˜์„ธ์š”"); button.getStyleClass().add("main-button"); VBox root = new VBox(20, label, button); root.setAlignment(javafx.geometry.Pos.CENTER); Scene scene = new Scene(root, 400, 300); scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm()); stage.setScene(scene); stage.setTitle("CSS ์ ์šฉ ์˜ˆ์ œ"); stage.show(); } public static void main(String[] args) { launch(args); } }
Java
๋ณต์‚ฌ

์‹ค์Šต 2: ๋ฒ„ํŠผ hover ์‹œ ์ƒ‰์ƒ ๋ณ€๊ฒฝ ํšจ๊ณผ

CSS์— hover ํšจ๊ณผ ์ถ”๊ฐ€
/* style.css์— ์ถ”๊ฐ€ */ .main-button { -fx-background-color: #4CAF50; -fx-text-fill: white; -fx-font-size: 16px; -fx-padding: 10px 20px; -fx-background-radius: 5px; -fx-cursor: hand; } .main-button:hover { -fx-background-color: #45a049; -fx-scale-x: 1.05; -fx-scale-y: 1.05; } .main-button:pressed { -fx-background-color: #3d8b40; }
CSS
๋ณต์‚ฌ
์„ค๋ช…:
โ€ข
:hover - ๋งˆ์šฐ์Šค๋ฅผ ๋ฒ„ํŠผ ์œ„์— ์˜ฌ๋ ธ์„ ๋•Œ ์Šคํƒ€์ผ
โ€ข
:pressed - ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์Šคํƒ€์ผ
โ€ข
-fx-scale-x, -fx-scale-y - ๋ฒ„ํŠผ ํฌ๊ธฐ๋ฅผ ์•ฝ๊ฐ„ ํ™•๋Œ€ํ•˜๋Š” ํšจ๊ณผ

์‹ค์Šต 3: ID/Class ๊ธฐ๋ฐ˜ ์„ ํƒ์ž ์ง€์ •

1) FXML ํŒŒ์ผ ์ž‘์„ฑ (sample.fxml)
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <VBox xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" stylesheets="@style.css" alignment="CENTER" spacing="20" prefWidth="400" prefHeight="300"> <Label id="titleLabel" text="JavaFX CSS ์‹ค์Šต"/> <Button styleClass="main-button" text="๊ธฐ๋ณธ ๋ฒ„ํŠผ"/> <Button styleClass="secondary-button" text="๋ณด์กฐ ๋ฒ„ํŠผ"/> <Button styleClass="danger-button" text="์‚ญ์ œ ๋ฒ„ํŠผ"/> </VBox>
XML
๋ณต์‚ฌ
stylesheets="@style.css" ์ฒ˜๋Ÿผ ์ง€์ •ํ•ด๋†“์œผ๋ฉด Java ์ฝ”๋“œ์—์„œ ๋”ฐ๋กœ CSS๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
2) CSS ํŒŒ์ผ์— ๋‹ค์–‘ํ•œ ์„ ํƒ์ž ์ถ”๊ฐ€
/* ID ์„ ํƒ์ž - ํŠน์ • ์š”์†Œ ํ•˜๋‚˜๋งŒ ์ง€์ • */ #titleLabel { -fx-font-size: 24px; -fx-font-weight: bold; -fx-text-fill: #333333; } /* ํด๋ž˜์Šค ์„ ํƒ์ž - ์—ฌ๋Ÿฌ ์š”์†Œ์— ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ */ .main-button { -fx-background-color: #4CAF50; -fx-text-fill: white; -fx-font-size: 16px; -fx-padding: 10px 20px; -fx-background-radius: 5px; } .main-button:hover { -fx-background-color: #45a049; } .secondary-button { -fx-background-color: #2196F3; -fx-text-fill: white; -fx-font-size: 16px; -fx-padding: 10px 20px; -fx-background-radius: 5px; } .secondary-button:hover { -fx-background-color: #0b7dda; } .danger-button { -fx-background-color: #f44336; -fx-text-fill: white; -fx-font-size: 16px; -fx-padding: 10px 20px; -fx-background-radius: 5px; } .danger-button:hover { -fx-background-color: #da190b; } /* ๋…ธ๋“œ ์„ ํƒ์ž - ๋ชจ๋“  Button์— ๊ณตํ†ต ์ ์šฉ */ Button { -fx-cursor: hand; -fx-font-family: "Malgun Gothic"; }
CSS
๋ณต์‚ฌ
3) Controller ํด๋ž˜์Šค
import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; public class CSSPracticeApp extends Application { @Override public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); Scene scene = new Scene(root); stage.setScene(scene); stage.setTitle("CSS ์„ ํƒ์ž ์‹ค์Šต"); stage.show(); } public static void main(String[] args) { launch(args); } }
Java
๋ณต์‚ฌ

์ „์ฒด ์‹ค์Šต ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

์‹ค์Šต ์™„๋ฃŒ ์ฒดํฌ๋ฆฌ์ŠคํŠธ:
โ€ข
style.css ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ Scene์— ์ ์šฉ
โ€ข
๋ฒ„ํŠผ์— :hover ํšจ๊ณผ ์ถ”๊ฐ€
โ€ข
ID ์„ ํƒ์ž(#titleLabel) ์‚ฌ์šฉ
โ€ข
ํด๋ž˜์Šค ์„ ํƒ์ž(.main-button) ์‚ฌ์šฉ
โ€ข
๋…ธ๋“œ ์„ ํƒ์ž(Button) ์‚ฌ์šฉ

์ถ”๊ฐ€ ์‹ค์Šต โ€“ CSS ๋™์  ๋ณ€๊ฒฝ

public void applyTheme(String cssFile) { Scene scene = button.getScene(); scene.getStylesheets().clear(); scene.getStylesheets().add(getClass().getResource(cssFile).toExternalForm()); }
Java
๋ณต์‚ฌ
โ€ข
CSS๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ํ˜„์žฌ Scene์— ์ฆ‰์‹œ ์ ์šฉ
โ€ข
๋‹คํฌ๋ชจ๋“œ / ๋ผ์ดํŠธ๋ชจ๋“œ ์ „ํ™˜์— ์œ ์šฉ