이것이 자바다 - 자바FX - 1
포스트
취소

이것이 자바다 - 자바FX - 1

init을 제외한 fx api는 application 스레드가 관리한다. –ip=192~ 와 같이 main 메소드 인자를 작성하면 =을 기준으로 매핑하거나 함께 리스트에 추가한다.

윈도우를 무대(Stage)로 표현하며 무대는 한 번에 하나의 장면(Scene)을 가진다. 메인 윈도우는 start 메소드의 매개 값으로 전달되지만 장면은 직접 생성해야 한다. UI의 루트 컨테이너인 Parent 클래스가 필요하다. Scene scene = new Scene(Parent root)

Parent는 추상 클래스이기 떄문에 주로 layout 패키지의 컨테이너들이 사용된다. 장면을 생성한 후 윈도우에 올리기 위해서 Stage의 setScene 메소드를 사용한다.


컨테이너를 Parent를 상속하는 클래스로 정했을 때
마찬가지로 getChildren 메소드로 Label, Button 등의
UI 컨트롤 요소를 특정 컨테이너 내부에 삽입한다. 
(ObservableList 혹은 getChildren 이후 add 메소드)
마지막으로 하나의 장면인 Scene을 윈도우에 올려준다.

장면에는 다양한 컨트롤이 포함되는데
이들을 배치하는 것이 레이아웃이다.
레이아웃은 프로그램적, 선언적(FXML) 두 가지로 나뉜다.

 - - - 

FXML 작성 요령은
컨테이너 내부에 여백과 간격 그리고 Children 태그를
수평적으로 구성하고 Children 태그 내부에 컨트롤 요소를 작성
마진과 패딩은 Insets 객체를 이용한다.

FXML 로딩과 Scene 생성
FXML 파일을 작성한 후 읽어들여 선언된 내용을 객체화해야함.
동일한 패키지에 있을 경우
```Parent root = FXMLLoader.load(getClass().getResource("xml"));```
다른 패키지에 있을 경우
로더 타입 변수에 참조 후 명시적 형변환을 이용하여
Parent 타입 변수에 참조

FX의 컨테이너
AnchorPane 컨트롤을 좌표로 배치
 빌더 이용, 좌표 배치이기에 윈도우 사이즈 조절 불가능하도록
BorderPane "상하좌우중"에 컨트롤 배치
 각 셀에 하나의 컨테이너 또는 컨트롤을 배치
FlowPane 행으로 배치, wrap
GridPane 그리드로 배치, 크기 유동적 셀
 셀 크기 유동적, 병합 가능, 입력 폼에 특화
TilePane 그리드로 배치, 크기 고정적 셀 (그리드는 단순히 격자 형태를 의미)
 FlowPane과 비슷하나 셀 크기 고정적
StackPane 컨트롤을 겹칠 수 있음
 Z-Index 특성을 가짐
HBox 수평 VBox 수직

 - - -

외부 CSS 
Type, id, class (Selector)
 
컨테이너 태그에 ```stylesheets="@app.css">``` OR
```scene.getStylesheets().add(getClass().getResource("app.css".toString))```
기능은 CSS 구버전과 같음 문법은 -fx- 추가

 - - - 

FX Application Thread는 싱글 스레드다.
시간을 요하는 작업이 진행될 땐 Worker Thread를 생성해야한다.
문제는 작업 스레드가 UI를 직접 변경할 수 없기 때문에
1.Platform.runLater
2.javafx.concurrent API인 Task, Service
둘 중 하나를 골라 사용해야 한다.
1. ```Platform.runLater(Runnable run);```
이벤트 큐에 Runnable을 저장하고 즉시 리턴함. (lazy)
2. Task는 비동기 작업. Service는 Task 작동 관련 기능 제공
익명 자식 객체로 call을 재정의해서 사용하자.
Task가 Runnable 인터페이스를 구현하고 있기 때문에
Runnable 매개 변수를 받는 인수에 전달할 수 있다.
이럼에도 UI를 직접 다룰 순 없으므로
call 메소드 내부에서 updateProgress, updateMessage 메소드를 호출하며
컨트롤러에서 바인딩하여 활용할 수 있다.
더 복잡한 구성을 원한다면 call 메소드 내부에
Platfrom.runLater를 호출하여 UI 변경코드를 작성한다.

Service 클래스는 작업 스레드와 JFAT가 올바르게 상호작용할 수 있도록 도움
Service 익명 자식 객체 내부에 createTask를 재정의하고
그 내부에 Task 생성과 call 재정의가 또 필요함.

while ( string a = readline != null) if( not chat 화면일때 )popup 띄우겟다 ```

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.