저는 지난 몇 주 동안 JavaFX를 배우고 있습니다. 내 눈에 WPF와 비교하는 방법에 대한 높은 수준의 개요입니다.
내 모든 의견은 JavaFX 2.0과 관련이 있습니다. 이 정보는 플랫폼이 아직 미성숙하고 활발하게 개발 중이므로 변경 될 수 있습니다.
제도법
WPF와 마찬가지로 JavaFX는 유지 된 그래픽 렌더링 시스템을 사용합니다. 사용자 인터페이스는 개념적으로 WPF와 유사한 것으로 생각할 수있는 '노드'로 구성된 장면 그래프로 구성 UIElement
됩니다.
JavaFX는 사용 가능한 경우 그래픽 렌더링을 GPU로 오프로드합니다. 그래픽 시스템은 Windows에서는 DirectX를, 다른 플랫폼에서는 OpenGL을 사용합니다.
마크 업
JavaFX 사용자 인터페이스는 코드 및 FXML 마크 업을 통해 생성 될 수 있습니다. 이는 요소를 중첩하여 객체 그래프를 생성 할 수 있다는 점에서 XAML과 유사합니다.
FXML에는 속성 바인딩 (단순 식만 해당) 및 이벤트 처리기에 대한 바인딩 (모든 onEvent 메서드) 과 같은 XAML과 유사한 기능이 있습니다. 이벤트 핸들러는 인라인으로 선언 할 수 있지만 일반적으로 연관된 컨트롤러의 이벤트에 바인딩합니다.
FXML 파일에는 복잡한 이벤트 핸들러를 선언하고 속성 간의 바인딩을 설정할 수있는 관련 컨트롤러가있을 수 있습니다. 이것은 MVC 의미의 컨트롤러이며 WPF 세계의 viewModel과 동일하지 않습니다 (일반적으로 컨트롤러는 노드 및 컨트롤에 대한 참조를 가짐).
WPF의 한 가지 차이점은 FXML이 BAML과 같은 중간 이진 표현으로 컴파일 되지 않는다는 것입니다. 아직 성능 문제를 발견하지 못했지만 시스템을 광범위하게 사용하지는 않았습니다. 그러나 플랫폼이 여전히 코드 작성을 권장하고 스타일이 별도로 선언되어 있으므로 FXML은 일반적으로 XAML보다 짧은 경향이 있습니다.
FXML에 대한 소개는 여기 에서 찾을 수 있습니다 .
씬 빌더는 무료로 제공되므로 (비어처럼) UI를 직접 코딩하는 것을 좋아하지 않는 경우 요소를 드래그 앤 드롭하고 속성을 설정하고 컨트롤러에서 코드에 바인딩하면 FXML이 자동으로 생성됩니다. 분명히 씬 빌더는 Expression Blend만큼 강력하지는 않지만 Visual Studio에서 제공하는 '디자이너'보다 여전히 낫습니다.
제본
JavaFX는 매우 강력한 속성과 바인딩 시스템을 가지고 있습니다. Java Bean 패턴은 속성을 캡슐화하는 클래스를 포함하도록 확장되었습니다 (WPF 종속성 속성이 속성을 나타내는 방식과 유사 함). 이러한 클래스는 무효화 및 변경 알림을 제공하는 인터페이스를 구현합니다.
무효화 알림과 변경 알림에는 차이가 있습니다. 무효화는 바인딩 표현식이 이제 유효하지 않으며 다시 계산해야 함을 알려줍니다. get()
또는 getValue()
메서드 를 통해 속성 값을 요청할 때까지 재계 산은 실제로 발생하지 않습니다 . 그러나 변경 리스너를 등록한 경우 표현식이 즉시 재평가되고 해당 속성에 바인딩 된 모든 항목이 변경 사항을 반영합니다.
JavaFX는 get 및 set 속성과 속성 래퍼의 인스턴스를 반환하는 메서드 (WPF 속성과 같이 정적이 아님)를 사용하여 WPF와 유사한 방식으로 이러한 속성을 노출합니다.
여러 속성 간에 복잡한 바인딩을 만들 수 있습니다 . 정수 속성이 다른 두 개의 합 (a = b + c)이되기를 원하십니까? 문제 없습니다. JavaFX는 이러한 종류의 관계를 표현하는 Fluent API를 제공합니다. EG
A. 추가 (B, C);
B 또는 C의 값이 변경되면 적절한 알림이 발생하여 시스템이 A를 재평가해야 함을 알 수 있습니다. 이 경우 A 값이 다른 속성에 바인딩되어 있으므로이 컨텍스트에서는 의미가 없기 때문에 A 값을 설정하려고하면 예외가 발생합니다.
이러한 표현식은 상당히 복잡한 EG 일 a = (b + c) * (d - e)
수 있으며 여러 속성을 포함 할 수 있습니다. 유창한 API는 읽고 사용하기가 쉽지만 일부 Microsoft 라이브러리에서 제공하는 Fluent API만큼 좋지는 않지만 JavaFX 자체보다는 Java 언어 제한에 더 가깝습니다.
동일한 유형의 속성간에 간단한 양방향 바인딩을 만들 수 있으므로 하나가 업데이트되면 다른 하나가 변경 사항을 자동으로 반영합니다.
JavaFX는 또한 API에서 제공하지 않는 사용자 정의 바인딩 표현식을 작성하거나 성능에 관심이있는 경우 직접 바인딩을 사용자 정의 할 수있는 저수준 API를 제공합니다.
JavaFX와 WPF의 가장 큰 차이점 중 하나는 바인딩이 태그에서 바인딩을 설정하는 WPF 방식과 비교하여 JavaFX의 코드에서 주로 수행된다는 것입니다.
속성 및 바인딩에 대한 소개는 여기 에서 찾을 수 있습니다 .
스타일
JavaFX는 CSS를 사용하여 장면 그래프에 포함 된 노드의 모양을 변경합니다. 각 노드 유형에 설정할 수있는 유형 및 속성을 설명하는 전체 사양을 사용할 수 있습니다.
JavaFX는 EG에서 정의하고 사용할 수있는 변수와 같이 CSS를 개선하는 데 도움이되는 몇 가지 추가 기능도 제공합니다.
.button {
my-custom-color: RGB(234, 44, 78);
}
.my-control {
-fx-background-color: my-custom-color
}
또한 그라디언트와 같은 것을 만드는 데 유용한 이전에 정의 된 다른 색상에서 색상을 추출 할 수있는 몇 가지 기능을 제공합니다. 이는 기본 색상 팔레트를 정의 할 수 있고 나머지는이 값에서 생성 할 수 있음을 의미합니다 (기본 JavaFX CSS 파일이 수행하는 작업입니다).
JavaFX CSS에서는 노드에서 사용하는 레이아웃 유형 을 정의 할 수 없습니다 (이를 작성하는 현재 모든 레이아웃은 코드에서 수행되어야 함). 이것은 HTML과 함께 사용할 때 정말 고통스러운 CSS의 한 측면이기 때문에 저에게 정말 잘 작동합니다.
개인적으로 저는 CSS보다 XAML 스타일을 선호하는데, 이는 제 취향에 비해 너무 장황한 경향이 있습니다.
JavaFX CSS에 대한 가이드는 여기 에서 찾을 수 있습니다 .
나열한 것
JavaFX는 WPF에서 제공하는 것과 유사한 여러 레이아웃 창을 제공합니다. 내가 알아 차린 한 가지 차이점은 측정 및 레이아웃 계약이 Region
클래스 의 상속 체인 위에 더 정의되어 있다는 것 입니다.
앞서 언급했듯이 레이아웃은 CSS를 사용하여 수행 할 수 없지만 코드, FXML을 사용하여 표현하거나 씬 빌더 (궁극적으로 FXML로 변환)를 사용하여 생성 할 수 있습니다.
통제 수단
JavaFX는 우리가 기대하는 제어 라이브러리를 계속해서 제공합니다. JavaFX와 WPF의 주요 차이점 중 하나는 컨트롤이 기본적으로 블랙 박스이며 WPF 컨트롤이 할 수있는 방식으로 다시 템플릿 할 수 없다는 것입니다. 또한 WPF 컨트롤보다 훨씬 적은 속성을 노출하는 것 같습니다.
컨트롤은 구현 특정 영역 중 일부를 CSS에 노출하여 컨트롤의 특정 영역을 스타일로 대상으로 지정할 수 있습니다. 이것은 컨트롤 의 하위 구조 로 알려져 있습니다. EG a CheckBox
는 두 개의 하위 구조를 노출합니다. 컨트롤의 각 부분을 독립적으로 스타일링 할 수 있도록하는 상자와 확인 표시. 앞에서 설명한 것처럼 컨트롤 의 모양 만 CSS를 사용하여 변경할 수 있지만 느낌 은 변경할 수 없습니다. 예 TabPane
를 들어, WPF에서 할 수있는 방식으로 내부 레이아웃 패널을 변경하여 콘텐츠 레이아웃 방식을 크게 변경할 수 없습니다 TabControl
.
이것은 상당히 제한적으로 들리지만 JavaFX에서 사용자 정의 컨트롤을 만드는 데 선호되는 방법은 레이아웃 패널에서 파생 된 라인을 따라 구성을 사용하여 표준 컨트롤을 배치하고 CSS를 사용하여 스타일을 다시 지정하는 것 같습니다.
결론
전반적으로 저는 JavaFX가 현재 제공하는 것에 매우 감동했습니다. WPF만큼 성숙하지는 않지만 활발하게 개발되고 있으며 Oracle은 확실히이를 뒷받침하는 것 같습니다. 성공 여부는 시간이 알려줄 것입니다.
JavaFX를 사용해 보는 것이 좋습니다. 설명서를 읽고 작은 응용 프로그램을 구성하고 생각을 확인하십시오.
또한 개발 팀의 정보로 정기적으로 업데이트되는 FXExperience.com 을 확인해야합니다 .