Java/17. JavaFX

Day 29 : JavaFX CSS 스타일 - 외부 CSS 파일

pancakemaker 2021. 11. 26. 12:07

외부 CSS 파일

: 인라인 스타일은 컨테이너와 style 속성으로 CSS를 직접 적용하기 때문에 동일한 스타일을 적용하는 컨테이너와 컨트롤이 많아질수록 중복 코드가 늘어나는 단점 존재

: 레이아웃과 CSS가 뒤섞여 추후 유지보수가 어려움

: 중복 코드를 줄이고, 재사용성을 높이면서 유지보수도 편리한 외부 CSS 파일을 작성해서 적용하는 것이 일반적

 

- 선택자

: 외부 CSS 파일은 스타일을 적용할 컨테이너와 컨트롤을 선택해주는 선택자가 필요

- 선택자의 종류

1. Type 선택자 : Type {속성:값; 속성:값; ...}

: 같은 타입의 컨테이너 또는 컨트롤을 모두 선택

2. id 선택자 : #id {속성:값, 속성:값, ...}

: 동일한 id 속성값을 가지고 있는 컨테이너 또는 컨트롤을 실행

3. class 선택자 : .class {속성:값, 속성:값, ...}

: 동일한 styleClass 속성값을 가지고 있는 컨테이너 또는 컨트롤을 선택

4. 상태별 선택자

 

CSS 파일 적용

: 개별 컨테이너 또는 컨트롤에 적용하거나 Scene에 추가하여 Scene 내부의 모든 컨테이너와 컨트롤러에 적용 가능

 

실행 클래스

package sec10.exam03_state_selector;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class AppMain extends Application {
	@Override
	public void start(Stage primaryStage) throws Exception {
		Parent root = (Parent)FXMLLoader.load(getClass().getResource("root.fxml"));
		Scene scene = new Scene(root);
		scene.getStylesheets().add(getClass().getResource("app.css").toString());
		
		primaryStage.setTitle("AppMain");
		primaryStage.setScene(scene);
		primaryStage.show();
	}
	
	public static void main(String[] args) {
		launch(args);
	}
}

 

id와 styleClass 속성이 있는 Label 배치

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>

<HBox xmlns:fx="http://javafx.com/fxml"
	prefHeight="50" prefWidth="400" alignment="CENTER" spacing="20">
   <children>
		<Label id="lblId" text="검정바탕,노란글씨"/>
		<Label styleClass="lblClass" text="파란바탕,흰글씨"/>
		<Label styleClass="lblClass" text="파란바탕,흰글씨"/>
   </children>
</HBox>

 

CSS 파일

/* 전체 Label 선택 */
Label {
	-fx-padding: 5;
}

/* id="lblId" 을 가진 컨트롤 선택 */
#lblId {
	-fx-background-color: black;
	-fx-text-fill: yellow;
}

/* styleClass="lblClass"을 가진 컨트롤 선택 */
.lblClass {
	-fx-background-color: blue;
	-fx-text-fill: white;
}

 

TextField와 Button 배치

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>

<HBox xmlns:fx="http://javafx.com/fxml" spacing="10"> 							
	<padding>																
		<Insets topRightBottomLeft="10"/>
	</padding>

	<children>	
		<TextField prefWidth="200"/>															
		<Button prefWidth="50" text="확인"/>
	</children>
</HBox>

 

CSS 파일

TextField:focused{
	-fx-border-color: skyblue;
	-fx-background-color: yellow;
}

Button:hover {
	-fx-border-color: skyblue;
	-fx-background-color: yellow;
}

Button:pressed {
	-fx-border-color: skyblue;
	-fx-background-color: red;
}