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

이것이 자바다 - 자바FX - 2

++ 이벤트 핸들러 ++ FX는 이벤트 발생 컨트롤과 핸들러를 분리하는 위임형 방식 사용
button.setOnAction(new EventHandler<ActionEvent>( ){실행문}) 익명 구현 객체를 이용한다. 함수형 인터페이스이므로 람다 가능
stage.setOnCloseReques( e -> { . . . } );

FXML 컨트롤러 루트 컨테이너 start tag 내부에 fx:controller="package.Controller">와 같이 작성된다.
패키지명과 Initializable 인터페이스의 구현 클래스명이다.
실체 메소드로 initialize가 있는데
컨트롤러 객체가 생성되고 나서 호출된다.
주로 UI 컨트롤의 초기화,
이벤트 핸들러 등록, 속성 감시 등의 코드가 작성된다.

컨트롤러는 이벤트 핸들러를 등록하기 위해서,
그리고 이벤트 처리 시 UI를 변경하기 위해서
FXML파일에 포함된 [컨테이너] 및 [컨트롤]의 참조가 필요하다.
이를 위해서 FXML 파일에 포함된 컨트롤들은 fx:id 속성을 가진다.
<Button fx:id="btn1" text="버튼1" />

fx:id 속성을 가진 컨트롤들은 컨트롤러의
@FXML 어노테이션이 적용된 필드에 자동 주입된다.
(id 속성값과 필드명이 당연히 같아야함)

로더가 FXML 파일을 로딩할 때, 태그로 선언된 컨트롤 객체가
생성되고, 아울러 컨트롤러 객체도 함께 생성된다.
이후 어노테이션이 적용된 필드에 컨트롤 객체가 주입된다.

EventHandler 등록
컨트롤에서 발생하는 이벤트를 처리하려면
컨트롤러의 intialize 메소드에서 EventHandler를 생성하고 등록해야함
클래스 멤버 메소드로 각 핸들러를 정의하고 내부에서 setter와 람다 사용

<Button fx:id="btn" text="버튼" onAction="#handleBtnAction"/>
public void handleBtnAction(ActionEvent event){ . . .}
컨트롤 요소 태그에 메소드를 직접 작성함으로써 간단히 매핑할 수 있다.


++ 컨트롤의 속성감시 ++
특정 컨트롤 요소의 value에 대한 리스너를 설정하여
다른 컨트롤러를 호출한다.
FX 컨트롤 속성은 세 가지 메소드로 구성된다.
Getter, Setter 그리고 Property 객체를 리턴하는 메소드이다.

text(컨트롤)의 속성 중 textProperty가 리턴하는 StringProperty에 리스너 설정

1
2
3
4
textPropery().addListener(new ChangeListener<String>() {
	@Override
	void changed(ObservableValue<? extends String> observable,
			String oldValue, String newValue) } );

addListener 메소드가 ChangeListener를 Property 객체에 설정하면, text 속성이 변경되었을 때 changed 메소드가 자동으로 실행된다.

속성 바인딩

Property로 속성을 호출하고 묶는다.   
양방향으로 묶고 싶다면 bindBidirectional 메소드를 이용하자.   
또는 Bindings.bindBidirectional( P p1, P p2 );, 해제하고 싶다면     unbind   
위의 bind 메소드 결과는 전위 객체는 후위객체에게 행위 종속된다.    
어떤 ???Property 메소드가 존재하는지, 리스너의 종류를 알아보자.   

연산된 속성 바인딩
```circle.centerYProperty().bind(Bindings.divde(root.heightProperty(), 2));```
원의 Y축 중앙 지점을 컨테이너 높이의 절반 위치에 고정시킨다.

- - -

++ FX 컨트롤 ++   
버튼 컨트롤: ButtonBase를 상속하는 하위 컨트롤   
Button, CheckBox, RadioButton, ToggleButton, Hyperlink   
ImageView를 매개값으로 setGraphic 메소드 호출하면 아이콘 넣을 수 있음.   
```<RadioButton text="L" userData="V" toggleGroup="$GN" selecte="true"/>```

입력 컨트롤   
TextField(한줄), TextArea(여러줄), PasswordField, ComboBox   (제한된항목)
DatePicker, ColorPicker, HTMLEditor     

뷰 컨트롤   
ListView, TableView, ImageView

미디어 컨트롤   
MediaView, Slider, ProgressBar, ProgressIndicator   
(Image, Media 둘 다 생성자에 리소스 경로를 인수로 넘기며 인스턴스화)

차트 컨트롤

- - -

++ 메뉴바와 툴바 ++   
MenuBar, menus, MenuItem, (Check, Radio, Custom, Separator)+MenuItem
accelerator는 KeyCodeCombination 객체를 이용하여 단축키를 설정한다.

툴바는 UI 컨트롤이면서 컨테이너이기도 하다.

 - - -

++ 다이얼로그 ++   
모달과 모달리스로 나뉘고 전자는 owner(Stage)를 중지시킨다.   
FileChooser, DirectoryChooser, Popup   

 - - - 

start 메소드에서 컨트롤러로 primaryStage를 전달   

FXMLLoader loader = new FXMLLoader(getClasee().getResource(“fxml”)); Parent root = loader.load(); RootController controller = loader.getController(); controller.setPrimaryStage(primaryStage); ``` RootController 클래스에 위 setter 메소드를 정의해야한다.

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