17.3 java FX 레이아웃

- Scene에는 다양한 컨트롤이 포함되는데 이를 배치하는 것이 레이아웃이다.


17.3.1 프로그램적 레이아웃

- 자바 코드로 UI 컨트롤을 배치하는 것을 말한다

- 자바 코드로만 개발하기 때문에 다른 언어를 익힐 필요가 없다

- 코드를 잘 정리 하지 않으면 난해한 프로그램이 될 확률이 높아진다

- 디자이너와 협력해서 개발하는 것이 어렵다

- 간단한 레이아웃 변경이나 스타일 변경이라도 자바 소스를 수정하고 재 컴파일해야 한다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package sec03.exam01_programmatical_layout;
 
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.layout.HBox;
import javafx.geometry.Insets;
import javafx.scene.control.TextField;
import javafx.scene.control.Button;
import javafx.scene.Scene;
import javafx.collections.ObservableList;
 
public class AppMain extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        HBox hbox = new HBox();//HBox 컨테이너 생성
        hbox.setPadding(new Insets(10,10,10,10));//안쪽 여백 설정
        hbox.setSpacing(10);//컨트롤간의 수평 간격 설정
        
        TextField textField = new TextField();//TextField 컨트롤 생성
        textField.setPrefWidth(200);//TextField의 폭 설정
        
        Button button = new Button();//Button 컨트롤 생성
        button.setText("확인");//Button 글자 설정
        
        ObservableList list = hbox.getChildren();//HBox의 ObservableList 얻기
        list.add(textField);//TextField 컨트롤 배치
        list.add(button);  //Button의 컨트롤 배치
        
        Scene scene = new Scene(hbox);//화면의 루트 컨테이너로 HBox 지정
        
        primaryStage.setTitle("AppMain");//윈도우 창 제목 설정
        primaryStage.setScene(scene);//윈도우 창에 화면 설정
        primaryStage.show();//윈도우 창 보여주기
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}
cs

17.3.2 FXML 레이아웃

- FXML은 XML 기반의 마크업 언어이다.

- JavaFX UI 레이아웃을 자바 코드에서 분리해서 태그로 선언하는 방법을 제공한다.

- 웹 애플리케이션 및 안드로이드(Android) 앱을 개발하는 방법과 유사하다

- 디자이너와 협업이 가능한다

- 간단한 레이아웃 변경이나 스타일 변경시 자바 소스를 수정할 필요가 없다. FXML 태그만 수정하면 된다

- 레이아웃이 비슷한 장면(Scene)들간에 재사용이 가능하다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package sec03.exam02_fxml_layout;
 
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 = FXMLLoader.load(getClass().getResource("root.fxml"));
        Scene scene = new Scene(root);
        
        primaryStage.setTitle("AppMain");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
 
<?import javafx.scene.layout.HBox?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
 
<HBox xmlns:fx="http://javafx.com/fxml" ><!-- HBox 컨테이너 선언 -->
    <padding><!-- 안쪽 여백 설정 -->
        <Insets top="10" right="10" bottom="10" left="10"/>
    </padding>
    <spacing>10</spacing><!-- 컨트롤간의 수평 간격 설정 -->
    
    <children><!-- 자식 컨트롤 추가 -->
        <TextField><!-- TextField 선언 -->
            <prefWidth>200</prefWidth><!-- TextField의 폭 설정 -->
        </TextField>
        
        <Button ><!-- Button 컨트롤 선언 -->
            <text>확인</text><!-- Button 글자 설정 -->
        </Button>
    </children>
</HBox>
cs



17.3.3 레이아웃 여백: 패딩(안쪽 여백)과 마진(바깥 여백)






 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package sec03.exam03_margin_padding;
 
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
 
public class AppMain extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        //패딩 설정-----------------------
        /*HBox hbox = new HBox();            
        hbox.setPadding(new Insets(50, 10, 10, 50)); 
            Button button = new Button();            
            button.setPrefSize(100, 100);*/        
        
        //마진 설정------------------------
        HBox hbox = new HBox();            
            Button button = new Button();        
            button.setPrefSize(100100);
            HBox.setMargin(button, new Insets(10105050));    
        
        hbox.getChildren().add(button);            
        
        Scene scene = new Scene(hbox);        
        
        primaryStage.setTitle("AppMain");        
        primaryStage.setScene(scene);        
        primaryStage.show();                    
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}
cs

// 패딩 설정                        // 마진 설정






17.3.4 FXML 작성 규칙

- FXML 태그는 자바 코드로 변환되어 실행되기 때문에 자바 코드와 매핑 관계가 존재

- 맵핑 관계만 잘 이해하면 JavaFXAPI를 참조해서 FXML 태그를 쉽게 작성


* 패키지 선언

- FXML 태그의 이름은 하나의 JavaFX API 클래스 이름과 매핑되기 때문에 해당 클래스가 존재하는 패키지를 반드시

<?import?> 태그로 선언해야 한다


* 태그 선언



* 속성 선언



* 객체 선언

- <클래스 속성="값"/>



- <클래스 fx:value="값">



- <클래스 fx:constant="상수">



- <클래스 fx:factory="정적메소드">



17.3.5 FXML 로딩과 Scene 생성



17.3.6 JavaFX Scene Builder

- 드래그 앤 드롭 방식의 WYSIWYG 디자인 툴

- 자동으로 FXML 파일 생성


Posted by 너래쟁이
: