2010-01-06 4 views
75

저는 주로 C# 프로그래머입니다. 약 10 년 전에 Java 작성을 중단했지만, 기사 읽기, 친구와의 대화 등 Java 기술을 따라 잡으려고합니다.JavaFX와 WPF의 차이점은 무엇입니까?

JavaFX라는 새롭고 풍부한 GUI 프레임 워크이지만 비 Java 병렬과 비교하는 리소스를 찾을 수 없습니다.

저는 C# 및 WPF에 대해 매우 익숙하므로 두 기술이 얼마나 비슷하거나 다른 지에 대해 생각해보고 싶습니다.

편집 : 아무 대답이오고있다으로보고, 좀 더 구체적으로하려고합니다 :

  1. WPF가 시각적 트리를 만들 수 XAML을 사용하여, 자바 FX는 비슷한 있나요?
  2. WPF는 MVVM 패턴의 뷰 모델에 바인딩하는 데 가장 적합하지만 JavaFX는 바인딩을 광범위하게 사용합니까?
  3. WPF는 렌더링을 위해 GPU를 사용하지만 JavaFX도 동일한 기능을 수행합니까?
  4. net pc에서 브라우저를 실행할 때 Silverlight를 JavaFX와 비교하면 어떻습니까? 비교 내용 (희망) 업데이트지고 계속 할 수 있도록

... 올 더 많이 ...

나는 커뮤니티 위키이 변화하고있다.

답변

101

저는 지난 2 주 동안 JavaFX를 배웠습니다. 여기 내 눈에 WPF와 비교 한 높은 수준의 개요가 있습니다 :

내 모든 의견은 JavaFX 2.0과 관련이 있습니다. 플랫폼이 아직 미성숙하고 적극적으로 개발되고 있기 때문에이 정보는 아마도 변경 될 수 있습니다.

WPF 그래픽 추천

는 자바 FX는 유지 그래픽 렌더링 시스템을 사용한다. 사용자 인터페이스는 개념적으로 WPF의 UIElement과 비슷한 것으로 생각할 수있는 '노드'로 구성된 장면 그래프로 구성됩니다.

JavaFX는 사용 가능한 경우 GPU에 그래픽 렌더링을 오프로드합니다. 그래픽 시스템은 Windows의 DirectX와 다른 플랫폼의 OpenGL을 사용합니다.

자바 FX 사용자 인터페이스는 코드와 오브젝트가 중첩 그래프 요소들에 의해 생성 될 수 있다는 점에서 유사하다 XAML FXML 태그 모두를 통해 생성 될 수 표식.

FXML에는 속성 바인딩 (간단한 식만 해당) 및 이벤트 처리기 바인딩 (모든 onEvent 메서드)과 같은 XAML과 유사한 몇 가지 기능이 있습니다. 이벤트 핸들러는 인라인으로 선언 할 수 있지만 일반적으로 연관된 컨트롤러의 이벤트에 바인딩합니다.

FXML 파일에는 복잡한 이벤트 처리기를 선언하고 속성간에 바인딩을 설정할 수있는 연결된 컨트롤러가있을 수 있습니다. 이것은 MVC 개념의 컨트롤러이며 WPF 세계의 viewModel과 다릅니다 (일반적으로 컨트롤러에는 노드와 컨트롤에 대한 참조가 있습니다).

WPML과의 한 가지 차이점은 FXML이 BAML과 같은 중간 이진 표현으로 컴파일 된 이 아니고이 아닌 것으로 나타났습니다. 성능 문제는 아직 발견하지 못했지만 시스템을 광범위하게 사용하지는 않았습니다. 플랫폼이 여전히 코드 작성을 권장하고 스타일이 별도로 선언되므로 FXML은 일반적으로 모든 XAML보다 단축되는 경향이 있습니다.

FXML에 대한 소개는 here입니다.

씬 빌더는 무료입니다 (맥주처럼). UI를 손으로 코딩하는 것을 좋아하지 않으면 요소를 드래그 앤 드롭하고 속성을 설정하고 컨트롤러의 코드에 바인딩하면 FXML이 자동으로 생성됩니다 . 분명히 장면 작성기는 Expression Blend만큼 강력하지는 않지만 Visual Studio에서 제공하는 '디자이너'보다 여전히 좋습니다.

바인딩

JavaFX는 매우 강력한 부동산 및 바인딩 시스템이 있습니다. Java Bean 패턴은 속성을 캡슐화하는 클래스를 포함하도록 확장되었습니다 (WPF 종속성 속성이 속성을 나타내는 방식과 비슷 함). 이러한 클래스는 무효화 및 변경 알림을 제공하는 인터페이스를 구현합니다.

무효화 알림과 변경 알림은 구분됩니다.무효화는 바인딩 표현식이 현재 유효하지 않으므로 재 계산해야한다고 알려줍니다. 재 계산은 get() 또는 getValue() 메서드를 통해 속성 값을 요청하기 전에는 실제로 발생하지 않습니다. 그러나 변경 리스너를 등록한 경우 표현식이 즉시 재평가되고 해당 속성에 바인딩 된 모든 것이 변경 사항을 반영합니다.

JavaFX는 get 및 set 속성과 속성 래퍼 (WPF 속성과 같이 정적이지 않은 인스턴스)를 반환하는 메서드를 사용하여 WPF와 비슷한 방식으로 이러한 속성을 노출합니다.

복잡한 바인딩은 다중 속성 사이에서 만들 수 있습니다. 다른 두 정수의 합이되도록 정수 속성을 원하십니까 (a = b + c)? JavaFX는 이런 종류의 관계를 표현하는 Fluent API를 제공합니다.

A.Add (B, C);

B 또는 C 중 하나의 값이 변경되면 시스템에서 A를 다시 평가해야한다는 것을 알 수 있도록 적절한 알림이 발생합니다. 이 경우 A의 값을 다른 속성에 바인딩 할 때이 값을 설정하면이 예외에서 의미가 없으므로 예외가 발생합니다.

이러한 표현식은 상당히 복잡 할 수 있습니다. a = (b + c) * (d - e)이며 여러 속성을 포함 할 수 있습니다. 유창한 API는 읽기 쉽고 사용하기 쉽지만 일부 Microsoft 라이브러리에서 제공하는 Fluent API의 일부만큼 좋지는 않지만 JavaFX 자체보다는 Java 언어 제한에 더 가깝습니다.

동일한 유형의 속성간에 간단한 양방향 바인딩을 만들 수 있으므로 하나가 업데이트되면 다른 하나는 자동으로 변경 사항을 반영합니다.

JavaFX는 API에서 제공하지 않는 사용자 정의 바인딩 표현식을 작성하려는 경우 또는 성능에 대해 우려하는 경우, 저해상도 API를 제공하여 사용자 정의 바인딩을 사용자 정의합니다.

JavaFX와 WPF의 가장 큰 차이점 중 하나는 바인딩이 주로 마크 업에서 바인딩을 설정하는 WPF 방식과 JavaFX의 코드에서 수행된다는 것입니다.

속성 및 바인딩에 대한 소개는 here입니다.

스타일

자바 FX 장면 그래프에 포함 된 노드의 모양을 변경하는 CSS를 사용합니다. 각 노드 유형에서 설정할 수있는 유형 및 등록 정보를 설명하는 전체 스펙이 있습니다.

JavaFX는 다른 곳에서 정의되고 사용될 수있는 변수와 같은 CSS를 개선하는 데 도움이되는 몇 가지 추가 기능을 제공합니다.

.button { 
    my-custom-color: RGB(234, 44, 78); 
} 

.my-control { 
    -fx-background-color: my-custom-color 
} 

그것은 또한 당신이 그라디언트 같은 것을 만드는 데 유용 다른 이전에 정의 된 색상의 색상을 도출 할 수 있도록 기능의 몇 가지를 제공합니다. 즉, 색상의 기본 팔레트를 정의하고 나머지는이 값에서 생성 할 수 있습니다 (기본 JavaFX CSS 파일이 수행하는 것입니다).

JavaFX CSS는 노드가 사용하는 유형 레이아웃을 정의 할 수 없습니다.이 글을 쓰는 동안 모든 레이아웃은 코드로 수행해야합니다.이 기능은 CSS에서 HTML과 함께 사용할 때 실제로 고통스럽게 만드는 CSS의 한 측면이기 때문에 정말 잘 작동합니다.

개인적으로 나는 CSS를 선호하여 XAML 스타일을 선호하는데 이는 내 취향에 너무 장황한 경향이 있습니다.

JavaFX CSS에 대한 지침은 here입니다.

레이아웃

자바 FX는 WPF에 의해 제공된 것과 유사한 레이아웃 창을 제공한다. 내가 알아챈 한 가지 차이점은 측정 및 레이아웃 계약이 Region 클래스의 상속 체인에서 더 많이 정의된다는 것입니다.

앞서 언급했듯이 CSS를 사용하여 레이아웃을 수행 할 수는 없지만 코드 FXML을 사용하여 표현하거나 장면 작성기 (궁극적으로 FXML로 변환 됨)를 사용하여 만들 수 있습니다.

제어

JavaFX는 우리가 기대하는 컨트롤의 적 성장 라이브러리를 제공합니다. JavaFX와 WPF의 주요 차이점 중 하나는 컨트롤이 본질적으로 블랙 박스이고 WPF 컨트롤이 할 수있는 방식으로 다시 템플릿 될 수 없다는 점입니다. 또한 WPF 컨트롤보다 훨씬 적은 속성을 노출하는 것처럼 보입니다.

컨트롤은 구현 특정 영역을 CSS에 표시하여 스타일에 따라 컨트롤의 특정 영역을 대상으로 지정할 수 있습니다. 이것은 하위 구조으로 알려져 있습니다. E.G. CheckBox은 두 하부 구조를 노출합니다. 상자 및 체크 표시는 컨트롤의 각 부분을 독립적으로 스타일을 지정할 수 있도록 해줍니다. 앞에서 설명한대로 의 모양이 인 CSS를 사용하여 변경할 수 있지만 의 느낌은 수 없습니다. E.G. WPF TabControl에서 할 수있는 방식으로 내부 레이아웃 패널을 변경하여 TabPane이 내용을 레이아웃하는 방식을 크게 변경할 수 없습니다.

상당히 제한적인 것처럼 들리지만, JavaFX에서 사용자 지정 컨트롤을 만드는 데 선호되는 방법은 표준 컨트롤을 배치하고 CSS를 사용하여 스타일을 다시 지정하기 위해 레이아웃 패널에서 파생 된 선을 따라 구성을 사용하는 것 같습니다.

결론

전반적으로 나는 자바 FX는 순간에 제공하는 것을 매우 감동. WPF만큼 성숙한 곳은 아니지만 적극적으로 개발되고 있으며 오라클은 분명히이를 뒷받침하는 것처럼 보입니다. 시간이 성공했는지 여부를 알 수 있습니다.

JavaFX를 사용해 보는 것이 좋습니다. documentation을 읽고 작은 응용 프로그램을 조합하여 생각해보십시오.

또한 개발 팀의 정보로 정기적으로 업데이트되는 FXExperience.com을 확인해야합니다.

+5

고마워요. 아주 교육이 잘되어 있어요. JavaFX에 대한 지식을 향상시키면서이 답변을 더욱 향상시킬 수 있다면 정말 좋을 것입니다. –

+3

나는 또한 귀하의 답변을 읽는 것을 즐겼으며, JavaFX로 작업 한 것이 더 깊은 통찰력을 드러낸다면 더 많은 것을 듣고 싶습니다. –

20

JavaFX에 대한 느낌을 얻는 가장 좋은 방법은 그냥 사용해 보는 것입니다. JavaFX 웹 사이트에는 좋은 자습서가 있습니다. 여기에 몇 가지이다 :

그들은 매우 신속하고 당신에게 언어에 대한 좋은 느낌을 제공합니다. 더 많은 자습서 및 기사에 관심이 있으시면 JavaFX 사이트에 많은 사람들이 있습니다. 질문에 대한 구체적인 답변을

:

  1. 자바 FX는이 XML 유도체되지 않습니다 "시각적 트리"를 만들기위한 자신의 선언적 언어입니다 있습니다. UI는 씬 그래프를 기반으로하므로 다양한 효과와 애니메이션을 그래프의 모든 노드에 적용 할 수 있습니다. 자세한 내용은 자습서를 참조하십시오. JavaFX 용 디자이너 도구도 있습니다 (아직 시도하지 않았습니다).
  2. JavaFX has binding built into the language.
  3. 데스크톱의 JavaFX는 GPU 렌더링을 사용하는 Java AWT/Swing을 사용합니다. 자바의 모든 버전은 GPU에 더 많은 그래픽을 제공하는 것으로 보인다. 썬의 크리스 캠벨 (Chris Campbell)은 GPU acceleration에 대해 블로그를 작성했습니다. JavaFX의 모바일 버전에 GPU 가속화 기능이 있는지 확실하지 않습니다. 이전 버전의 JavaFX는 필자가 필요로하는 것만 큼 성능이 좋지 않았지만 이전 버전보다 최신 버전의 성능이 크게 향상되었음을 알았습니다.
  4. JavaFx는 Java 애플릿을 사용하여 브라우저에서 실행합니다. Java 6 update 10부터는 Java 애플릿 프레임 워크가 수정되었지만 Adobe Flash만큼 매끄럽지는 않지만 훨씬 개선되었습니다. Silverlight가 Linux에서 작동하는 데 문제가 있었지만 JavaFX가 Linux에서 작동하는 데 어려움을 겪었습니다.

Here's another related question.

+14

이 답변은 JavaFX가 Java 7에서 중요한 업데이트를 거치면서 구식입니다. [여기를보십시오] (http://docs.oracle.com/javafx/2/overview/jfxpub-overview.htm). –

+6

JavaFX가 swing과 AWT를 사용하고 있습니까? 프리즘이라는 자체 렌더링 엔진이 있다고 생각합니다. No Event Dispatch 스레드는 JavaFX 응용 프로그램을 실행할 때 만들어집니다. –

관련 문제