ฉันได้เรียนรู้ JavaFX ในช่วงสองสามสัปดาห์ที่ผ่านมา นี่คือภาพรวมระดับสูงของการเปรียบเทียบกับ WPF ในสายตาของฉัน:
ความคิดเห็นทั้งหมดของฉันเกี่ยวข้องกับ JavaFX 2.0 ข้อมูลนี้อาจมีการเปลี่ยนแปลงเนื่องจากแพลตฟอร์มยังค่อนข้างไม่บรรลุนิติภาวะและกำลังได้รับการพัฒนาอย่างต่อเนื่อง
กราฟิก
เช่นเดียวกับ WPF JavaFX ใช้ระบบการแสดงผลกราฟิกที่เก็บรักษาไว้ ส่วนติดต่อผู้ใช้ประกอบด้วยภาพกราฟซึ่งประกอบด้วย 'โหน' ซึ่งสามารถจะคิดว่าเป็นแนวคิดที่คล้ายกับของ UIElement
WPF
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
ออกวางเนื้อหาโดยการเปลี่ยนรูปแบบของแผงภายในในแบบที่คุณสามารถมี TabControl
WPF
ในขณะที่ฟังดูค่อนข้าง จำกัด แต่วิธีที่ต้องการในการสร้างการควบคุมแบบกำหนดเองใน JavaFX ดูเหมือนว่าจะใช้การจัดองค์ประกอบตามแนวที่ได้มาจากแผงเค้าโครงเพื่อวางตำแหน่งตัวควบคุมมาตรฐานและจัดรูปแบบใหม่โดยใช้ CSS
สรุป
โดยรวมแล้วฉันประทับใจมากกับสิ่งที่ JavaFX นำเสนอในขณะนี้ ในขณะที่มันไม่ได้อยู่ใกล้กับ WPF แต่ก็กำลังได้รับการพัฒนาอย่างแข็งขันและ Oracle ดูเหมือนจะให้การสนับสนุนสิ่งนี้ เวลาจะบอกได้ว่าสำเร็จหรือไม่
ฉันอยากจะแนะนำให้ลองใช้ JavaFX อ่านเอกสารและลองรวบรวมแอปพลิเคชันขนาดเล็กและดูว่าคุณคิดอย่างไร
คุณควรตรวจสอบFXExperience.comซึ่งได้รับการอัปเดตเป็นประจำพร้อมข้อมูลจากทีมพัฒนา