JavaFX เปรียบเทียบกับ WPF อย่างไร [ปิด]


94

ฉันส่วนใหญ่เป็นโปรแกรมเมอร์ C # ฉันเลิกเขียน Java เมื่อประมาณ 10 ปีที่แล้ว แต่ฉันพยายามติดตามเทคโนโลยีใน Java โดยการอ่านบทความพูดคุยกับเพื่อน ฯลฯ

ฉันเคยได้ยินเกี่ยวกับเฟรมเวิร์ก GUI แบบใหม่ที่เรียกว่า JavaFX แต่ไม่พบทรัพยากรใด ๆ ที่เปรียบเทียบกับแนวเทียบที่ไม่ใช่ Java

เนื่องจากฉันคุ้นเคยกับ C # และ WPF เป็นอย่างดีฉันจึงอยากทราบว่าเทคโนโลยีทั้งสองเหมือนหรือแตกต่างกันอย่างไร

แก้ไข: เมื่อไม่มีคำตอบมาฉันจะพยายามเจาะจงมากขึ้น:

  1. WPF ใช้ XAML เพื่อสร้างแผนผังภาพ JavaFX มีอะไรที่คล้ายกันหรือไม่?
  2. WPF ใช้กับการเชื่อมต่อกับโมเดลมุมมองในรูปแบบ MVVM ได้ดีที่สุด JavaFX ยังใช้ประโยชน์จากการผูกได้อย่างกว้างขวางหรือไม่
  3. WPF ใช้ GPU ในการเรนเดอร์ JavaFX ทำเหมือนกันหรือไม่
  4. Silverlight เปรียบเทียบกับ JavaFX อย่างไรเมื่อเรียกใช้ผ่านเบราว์เซอร์บนเน็ตพีซี

... ขึ้นมา ...

ฉันกำลังเปลี่ยนสิ่งนี้เป็นวิกิชุมชนเพื่อให้การเปรียบเทียบได้รับการอัปเดต (หวังว่า)


7
น่าตลกที่คำถามที่มีการโหวตถึง 83 ครั้งถือได้ว่าไม่สร้างสรรค์
kristianp

คำตอบ:


121

ฉันได้เรียนรู้ JavaFX ในช่วงสองสามสัปดาห์ที่ผ่านมา นี่คือภาพรวมระดับสูงของการเปรียบเทียบกับ WPF ในสายตาของฉัน:

ความคิดเห็นทั้งหมดของฉันเกี่ยวข้องกับ JavaFX 2.0 ข้อมูลนี้อาจมีการเปลี่ยนแปลงเนื่องจากแพลตฟอร์มยังค่อนข้างไม่บรรลุนิติภาวะและกำลังได้รับการพัฒนาอย่างต่อเนื่อง

กราฟิก

เช่นเดียวกับ WPF JavaFX ใช้ระบบการแสดงผลกราฟิกที่เก็บรักษาไว้ ส่วนติดต่อผู้ใช้ประกอบด้วยภาพกราฟซึ่งประกอบด้วย 'โหน' ซึ่งสามารถจะคิดว่าเป็นแนวคิดที่คล้ายกับของ UIElementWPF

JavaFX จะยกเลิกการโหลดการแสดงผลกราฟิกไปยัง GPU หากมี ระบบกราฟิกใช้ DirectX บน Windows และ OpenGL บนแพลตฟอร์มอื่น ๆ

มาร์กอัป

อินเทอร์เฟซผู้ใช้ JavaFX สามารถสร้างได้ทั้งในโค้ดและผ่านมาร์กอัป FXML ซึ่งคล้ายกับ XAML ตรงที่กราฟออบเจ็กต์สามารถสร้างได้โดยองค์ประกอบที่ซ้อนกัน

FXML มีคุณสมบัติบางอย่างที่คล้ายกับ XAML เช่นการผูกคุณสมบัติ (นิพจน์ทั่วไปเท่านั้น) และการผูกกับตัวจัดการเหตุการณ์ ( วิธีonEventใด ๆ) ตัวจัดการเหตุการณ์สามารถประกาศได้ในบรรทัด แต่โดยทั่วไปคุณจะเชื่อมโยงกับเหตุการณ์ในตัวควบคุมที่เกี่ยวข้อง

ไฟล์ FXML สามารถมีคอนโทรลเลอร์ที่เกี่ยวข้องซึ่งช่วยให้คุณสามารถประกาศตัวจัดการเหตุการณ์ที่ซับซ้อนและตั้งค่าการเชื่อมโยงระหว่างคุณสมบัติ นี่คือคอนโทรลเลอร์ในความหมาย MVC และไม่เหมือนกับ viewModel ในโลก WPF (โดยทั่วไปคอนโทรลเลอร์จะมีการอ้างอิงถึงโหนดและตัวควบคุม)

ความแตกต่างอย่างหนึ่งของ WPF คือดูเหมือนว่า FXML ไม่ได้ถูกคอมไพล์เป็นตัวแทนแบบไบนารีระดับกลางเช่น BAML ฉันยังไม่สังเกตเห็นปัญหาด้านประสิทธิภาพ แต่ยังไม่ได้ใช้ระบบนี้อย่างกว้างขวาง ฉันสังเกตว่า FXML มักจะสั้นกว่า XAML ใด ๆ เนื่องจากแพลตฟอร์มยังคงสนับสนุนให้คุณเขียนโค้ดและมีการประกาศสไตล์แยกกัน

แนะนำให้รู้จักกับ FXML สามารถพบได้ที่นี่

เครื่องมือสร้างฉากมีให้ฟรี (เช่นเดียวกับเบียร์) ดังนั้นหากคุณไม่ชอบการเข้ารหัส UI ด้วยมือคุณสามารถลากและวางองค์ประกอบตั้งค่าคุณสมบัติและเชื่อมโยงกับโค้ดในคอนโทรลเลอร์ของคุณและ FXML จะถูกสร้างขึ้นโดยอัตโนมัติ เห็นได้ชัดว่าตัวสร้างฉากไม่มีที่ไหนที่ทรงพลังเท่า Expression Blend แต่ก็ยังดีกว่า 'ผู้ออกแบบ' ที่ Visual Studio จัดเตรียมไว้

ผูกพัน

JavaFX มีคุณสมบัติและระบบการผูกที่ทรงพลังมาก รูปแบบ Java Bean ได้รับการขยายเพื่อรวมคลาสที่ห่อหุ้มคุณสมบัติ (คล้ายกับวิธีที่คุณสมบัติการพึ่งพา WPF แสดงถึงคุณสมบัติ) คลาสเหล่านี้ใช้อินเทอร์เฟซที่ให้การแจ้งเตือนที่ไม่ถูกต้องและการเปลี่ยนแปลง

มีความแตกต่างระหว่างการแจ้งเตือนการยกเลิกและการแจ้งเตือนการเปลี่ยนแปลง การไม่ถูกต้องจะบอกให้คุณทราบว่าขณะนี้นิพจน์การผูกไม่ถูกต้องและจำเป็นต้องคำนวณใหม่ การคำนวณใหม่จะไม่เกิดขึ้นจริงจนกว่าคุณจะร้องขอมูลค่าคุณสมบัติผ่านทางget()หรือgetValue()วิธีการ อย่างไรก็ตามหากคุณได้ลงทะเบียนตัวฟังการเปลี่ยนแปลงนิพจน์จะได้รับการประเมินอีกครั้งทันทีและสิ่งใดก็ตามที่เชื่อมโยงกับคุณสมบัตินั้นจะแสดงถึงการเปลี่ยนแปลง

JavaFX แสดงคุณสมบัติเหล่านี้ในลักษณะเดียวกับ WPF ด้วยคุณสมบัติ get and set และวิธีการที่ส่งคืนอินสแตนซ์ของตัวห่อคุณสมบัติ (ซึ่งไม่คงที่เหมือนคุณสมบัติ WPF)

การผูกที่ซับซ้อนสามารถสร้างได้ระหว่างคุณสมบัติหลาย ๆ ต้องการให้คุณสมบัติจำนวนเต็มเป็นผลรวมของอีกสองตัว (a = b + c) หรือไม่? ไม่มีปัญหา JavaFX มี Fluent API เพื่อแสดงความสัมพันธ์ประเภทนี้เช่น

ก. เพิ่ม (B, C);

หากค่าของ B หรือ C เปลี่ยนแปลงไปการแจ้งเตือนที่เหมาะสมจะเพิ่มขึ้นเพื่อให้ระบบทราบว่า A ต้องได้รับการประเมินใหม่ โปรดทราบว่าในกรณีนี้ข้อยกเว้นจะเกิดขึ้นหากคุณลองและตั้งค่า A เนื่องจากถูกผูกไว้กับคุณสมบัติอื่น ๆ ดังนั้นจึงไม่สมเหตุสมผลในบริบทนี้

นิพจน์เหล่านี้อาจเป็น EG ที่ค่อนข้างซับซ้อนa = (b + c) * (d - e)และสามารถรวมคุณสมบัติจำนวนเท่าใดก็ได้ API ที่คล่องแคล่วนั้นค่อนข้างง่ายต่อการอ่านและใช้งาน แต่ก็ไม่ดีเท่า Fluent API บางตัวที่จัดทำโดยไลบรารี Microsoft บางตัว แต่มันขึ้นอยู่กับข้อ จำกัด ภาษา Java มากกว่า JavaFX เอง

การเชื่อมแบบสองทิศทางอย่างง่ายสามารถสร้างขึ้นระหว่างคุณสมบัติประเภทเดียวกันได้ดังนั้นหากมีการอัปเดตอีกคุณสมบัติหนึ่งจะสะท้อนการเปลี่ยนแปลงโดยอัตโนมัติ

JavaFX ยังมี API ระดับต่ำเพื่อปรับแต่งการเชื่อมโยงด้วยตัวคุณเองหากคุณต้องการสร้างนิพจน์การผูกแบบกำหนดเองที่ API ไม่ได้จัดเตรียมไว้ให้หรือหากคุณกังวลเกี่ยวกับประสิทธิภาพ

ความแตกต่างที่ใหญ่ที่สุดอย่างหนึ่งระหว่าง JavaFX และ WPF คือการเชื่อมโยงส่วนใหญ่ดำเนินการในโค้ดใน JavaFX เทียบกับวิธี WPF ในการสร้างการเชื่อมโยงในการมาร์กอัป

แนะนำให้รู้จักกับคุณสมบัติและการผูกสามารถพบได้ที่นี่

รูปแบบ

JavaFX ใช้ 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 เป็นสไตล์ XAML ซึ่งมักจะดูละเอียดเกินไปสำหรับความชอบของฉัน

คู่มือการ JavaFX CSS สามารถพบได้ที่นี่

เค้าโครง

JavaFX จัดเตรียมบานหน้าต่างโครงร่างจำนวนหนึ่งที่คล้ายกับที่จัดเตรียมโดย WPF ความแตกต่างอย่างหนึ่งที่ฉันสังเกตเห็นคือสัญญาการวัดและโครงร่างถูกกำหนดเพิ่มเติมในห่วงโซ่การสืบทอดในRegionคลาส

ดังที่ได้กล่าวไว้ก่อนหน้านี้ไม่สามารถดำเนินการ Layout โดยใช้ CSS แต่สามารถแสดงโดยใช้โค้ด FXML หรือสร้างโดยใช้ตัวสร้างฉาก (ซึ่งท้ายที่สุดจะถูกแปลงเป็น FXML)

การควบคุม

JavaFX มีไลบรารีการควบคุมที่เพิ่มขึ้นเรื่อย ๆ ที่เราคาดไม่ถึง ความแตกต่างที่สำคัญอย่างหนึ่งระหว่าง JavaFX และ WPF คือการควบคุมเป็นกล่องดำเป็นหลักและไม่สามารถสร้างเทมเพลตซ้ำได้ในแบบที่ควบคุม WPF ได้ ดูเหมือนว่าจะแสดงคุณสมบัติน้อยกว่าตัวควบคุม WPF มาก

การควบคุมจะเปิดเผยขอบเขตการใช้งานบางส่วนให้กับ CSS ทำให้พื้นที่เฉพาะของการควบคุมสามารถกำหนดเป้าหมายตามสไตล์ของคุณได้ สิ่งนี้เรียกว่าโครงสร้างย่อยของตัวควบคุม เช่น a CheckBoxแสดงโครงสร้างย่อยสองโครงสร้าง ช่องและเครื่องหมายถูกทำให้แต่ละส่วนของการควบคุมสามารถจัดสไตล์ได้อย่างอิสระ โปรดทราบว่าตามที่อธิบายไว้ก่อนหน้านี้เฉพาะรูปลักษณ์ของตัวควบคุมเท่านั้นที่สามารถเปลี่ยนแปลงได้โดยใช้ CSS แต่ความรู้สึกไม่สามารถทำได้ EG คุณไม่สามารถเปลี่ยนแปลงอย่างรวดเร็ววิธีการTabPaneออกวางเนื้อหาโดยการเปลี่ยนรูปแบบของแผงภายในในแบบที่คุณสามารถมี TabControlWPF

ในขณะที่ฟังดูค่อนข้าง จำกัด แต่วิธีที่ต้องการในการสร้างการควบคุมแบบกำหนดเองใน JavaFX ดูเหมือนว่าจะใช้การจัดองค์ประกอบตามแนวที่ได้มาจากแผงเค้าโครงเพื่อวางตำแหน่งตัวควบคุมมาตรฐานและจัดรูปแบบใหม่โดยใช้ CSS

สรุป

โดยรวมแล้วฉันประทับใจมากกับสิ่งที่ JavaFX นำเสนอในขณะนี้ ในขณะที่มันไม่ได้อยู่ใกล้กับ WPF แต่ก็กำลังได้รับการพัฒนาอย่างแข็งขันและ Oracle ดูเหมือนจะให้การสนับสนุนสิ่งนี้ เวลาจะบอกได้ว่าสำเร็จหรือไม่

ฉันอยากจะแนะนำให้ลองใช้ JavaFX อ่านเอกสารและลองรวบรวมแอปพลิเคชันขนาดเล็กและดูว่าคุณคิดอย่างไร

คุณควรตรวจสอบFXExperience.comซึ่งได้รับการอัปเดตเป็นประจำพร้อมข้อมูลจากทีมพัฒนา


9
ขอบคุณมากสำหรับสิ่งนี้นี่เป็นการให้ความรู้มาก หากคุณสามารถปรับปรุงคำตอบนี้ได้ในขณะที่คุณพัฒนาความรู้เกี่ยวกับ JavaFX ให้ดียิ่งขึ้นมันจะยอดเยี่ยม
Aviad P.

5
ฉันชอบอ่านคำตอบของคุณและชอบที่จะได้ยินมากขึ้นหากงานของคุณกับ JavaFX เปิดเผยข้อมูลเชิงลึกเพิ่มเติม
Paul-Sebastian Manole

21

ฉันคิดว่าวิธีที่ดีที่สุดในการสัมผัสกับ JavaFX คือการลองใช้งาน มีบทเรียนดีๆบนเว็บไซต์ JavaFX นี่คือสองสาม:

พวกเขาค่อนข้างรวดเร็วและให้ความรู้สึกที่ดีกับภาษา มีคนอื่น ๆ อีกมากมายในไซต์JavaFXหากคุณสนใจบทช่วยสอนและบทความเพิ่มเติม

สำหรับคำตอบเฉพาะสำหรับคำถามของคุณ:

  1. JavaFX มีภาษาประกาศเป็นของตัวเองสำหรับการสร้าง "แผนผังภาพ" ซึ่งไม่ใช่อนุพันธ์ xml UI จะขึ้นอยู่กับกราฟฉากเพื่อให้คุณสามารถใช้เอฟเฟกต์และภาพเคลื่อนไหวต่างๆกับโหนดใดก็ได้ในกราฟ ดูบทแนะนำสำหรับข้อมูลเพิ่มเติม นอกจากนี้ยังมีเครื่องมือออกแบบสำหรับ JavaFX (ซึ่งฉันยังไม่ได้ลอง)
  2. JavaFX ได้ผูกพันที่สร้างขึ้นในภาษา
  3. JavaFX บนเดสก์ท็อปใช้ Java AWT / Swing ซึ่งใช้การแสดงผล GPU Java ทุกเวอร์ชันดูเหมือนจะลดการโหลดกราฟิกลงใน GPU มากขึ้น คริสแคมป์เบลจากดวงอาทิตย์ได้ blogged บางอย่างเกี่ยวกับการเร่งความเร็ว GPU ฉันไม่แน่ใจว่า JavaFX เวอร์ชันมือถือมีการเร่งความเร็ว GPU หรือไม่ ฉันพบว่า JavaFX เวอร์ชันก่อนหน้ามีประสิทธิภาพไม่เพียงพอสำหรับสิ่งที่ฉันต้องการ แต่ฉันรู้ว่าเวอร์ชันล่าสุดมีการปรับปรุงประสิทธิภาพที่สำคัญมากกว่าเวอร์ชันก่อนหน้าและยังคงทำงานเพื่อทำให้เร็วขึ้น
  4. JavaFx ใช้ Java Applets เพื่อรันในเบราว์เซอร์ ตั้งแต่การอัปเดต Java 6 10 เฟรมเวิร์กแอพเพล็ต Java ได้รับการปรับปรุงใหม่และแม้ว่าจะไม่ราบรื่นเท่า Adobe flash แต่ก็มีการปรับปรุงให้ดีขึ้นมาก ฉันไม่แน่ใจว่ามันเปรียบเทียบกับ Silverlight ได้อย่างไรนอกเหนือจากที่ฉันมีปัญหาในการทำให้ Silverlight ทำงานบน Linux แต่ทำให้ JavaFX ทำงานบน Linux ได้

นี่เป็นอีกหนึ่งคำถามที่เกี่ยวข้อง


15
คำตอบนี้ล้าสมัยเนื่องจาก JavaFX ได้ผ่านการอัปเดตที่สำคัญใน Java 7 ดูที่นี่ .
Zoltán

7
แน่ใจหรือว่า JavaFX ใช้สวิงและ AWT ฉันเชื่อว่ามันมีเอนจิ้นการเรนเดอร์ของตัวเองที่เรียกว่าปริซึม ไม่มีการสร้างเธรด Event Dispatch เมื่อรันแอป JavaFX
Andy จนถึง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.