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
๋ณต์ฌ
์ ์ฒด ์ค์ต ํ๋ก์ ํธ ๊ตฌ์กฐ
์ค์ต ์๋ฃ ์ฒดํฌ๋ฆฌ์คํธ:
โข
โข
โข
โข
โข
์ถ๊ฐ ์ค์ต โ CSS ๋์ ๋ณ๊ฒฝ
public void applyTheme(String cssFile) {
Scene scene = button.getScene();
scene.getStylesheets().clear();
scene.getStylesheets().add(getClass().getResource(cssFile).toExternalForm());
}
Java
๋ณต์ฌ
โข
CSS๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ํ์ฌ Scene์ ์ฆ์ ์ ์ฉ
โข
๋คํฌ๋ชจ๋ / ๋ผ์ดํธ๋ชจ๋ ์ ํ์ ์ ์ฉ




