เราควรใช้ FXML ในการควบคุมแบบกำหนดเองของ JavaFX หรือไม่?

ดูเหมือนว่าจะถามแบบนี้ ฉันคิดว่าการใช้ FXML เพื่อเขียนส่วนประกอบที่กำหนดเองของเราเป็นแนวทางที่ถูกต้องอย่างเห็นได้ชัด

แต่อย่างที่เราเห็นได้จาก ControlsFX, JFXextras และแม้แต่หนังสือ 'การควบคุม Mastering JavaFX8 ไม่ได้ใช้หรือกล่าวถึงการใช้ FXML ในการควบคุมแบบกำหนดเอง

อย่างไรก็ตาม มีเอกสารอย่างเป็นทางการที่บอกว่าจะไปตามเส้นทางนั้น และสร้างการควบคุม JavaFX ผ่าน FXML

วิธีใดที่ถูกต้องกว่าและเพราะเหตุใด


person David Limkys    schedule 17.11.2014    source แหล่งที่มา


คำตอบ (2)


มีการควบคุมแบบกำหนดเองสองประเภทใน JavaFX:

  • fx:root การควบคุมแบบกำหนดเอง: การควบคุมแบบกำหนดเองเหล่านี้มีสไตล์ได้ (รองรับ CSS) แต่ไม่ได้ สกินได้

    หากคุณเป็นนักพัฒนาแอปพลิเคชัน นี่คือสิ่งที่คุณต้องการใช้เป็นส่วนใหญ่

    การควบคุมประเภทนี้มักจะเป็นแอปพลิเคชันหรือเฉพาะองค์กร ไม่จำเป็นต้องใช้สกินที่กำหนดเองเพิ่มเติมสำหรับการควบคุมเหล่านี้ CSS ก็เพียงพอแล้ว

    โดยปกติแล้วพวกเขาจะจัดกลุ่มการควบคุมบางอย่างเข้าด้วยกันและจัดเตรียม API ที่ดีกว่าและซ่อนส่วนควบคุมภายใน

    เขียนได้ง่ายกว่าการควบคุมแบบกำหนดเองที่สามารถสกินได้มาก

    ฉันคิดว่านี่เป็นทางเลือกหนึ่งของคลาสย่อย JPanel ในโลกสวิง

    ฉันขอแนะนำให้แบ่ง GUI ของคุณออกเป็น fx: การควบคุมแบบรูทที่มีในตัวเองขนาดเล็ก (การทำงานร่วมกันสูง, การมีเพศสัมพันธ์ต่ำ) ใช้รูปแบบตัวกลางเพื่อรวมการควบคุมเหล่านี้ (ตัวควบคุมหลักจัดการ/กำหนดค่าการควบคุมลูก และรับฟังเหตุการณ์ของการควบคุมลูก การควบคุมลูกไม่รู้จักกันและกัน)

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

  • การควบคุมแบบกำหนดเองที่สามารถสกินได้: การควบคุมแบบกำหนดเองที่สามารถสกินได้ไม่เพียงแต่สามารถจัดสไตล์ได้ (ผ่าน CSS) แต่รูปลักษณ์และความรู้สึกสามารถเปลี่ยนแปลงได้อย่างสมบูรณ์โดยการจัดเตรียมสกินแบบกำหนดเอง

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

    การควบคุมประเภทนี้มักจะเป็นการควบคุมขั้นพื้นฐานที่สามารถนำกลับมาใช้ใหม่ได้มากและบ่อยครั้ง (แต่ไม่เสมอไป) จะใช้การลงสีแบบกำหนดเองเช่นกัน

    ยากที่จะได้รับสิทธิมากกว่าการควบคุมแบบกำหนดเองตาม fx:root

person Puce    schedule 18.11.2014
comment
คำตอบที่ยอดเยี่ยม โปรดทราบว่าด้วยการควบคุมที่ใช้ fx:root การควบคุมของคุณจะต้องเปิดเผยรายการโหนดย่อยที่แก้ไขได้ (เช่น เป็นคลาสย่อยของ Pane) ซึ่งเป็นแง่มุมหนึ่งที่ทำให้สิ่งนี้ค่อนข้างไม่เหมาะสมสำหรับการพัฒนาไลบรารี คอนโทรลแบบกำหนดเองที่สามารถสกินได้สามารถเป็นคลาสย่อยของ Control ดังนั้นองค์ประกอบที่ประกอบเป็นคอนโทรลจึงไม่สามารถเพิ่มหรือลบออกโดยผู้ใช้ปลายทางได้ และตามที่คุณชี้ให้เห็นว่ามันเหมาะสมกับตำแหน่งปกติในลำดับชั้น API - person James_D; 18.11.2014
comment
Oracle เลือกใช้ (เป็นหลัก) วิธีการ fx:root เมื่อสร้าง SceneBuilder ดังนั้นคุณจึงสามารถ ศึกษาซอร์สโค้ดของ SceneBuilder เพื่อดูตัวอย่างที่ชัดเจนที่ใช้ในโค้ดแอปพลิเคชันคุณภาพการผลิต - person jewelsea; 18.11.2014

ไม่มีทางที่ถูกต้อง แต่เราอาจแยกย่อยได้เป็นดังนี้:

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

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

และเหนือสิ่งอื่นใด: มีส่วนประกอบแบบกำหนดเองมากมายที่ใช้เค้าโครงพิเศษซึ่งไม่มีอยู่ใน JavaFX เพื่อให้บรรลุเป้าหมายนั้น คุณจะต้องเขียนคอนเทนเนอร์ของคุณเองและโยงส่วนประกอบเหล่านั้นเข้ากับส่วนประกอบแบบกำหนดเองเพื่อให้ได้ผลลัพธ์ที่สมบูรณ์แบบ ในท้ายที่สุด ส่วนประกอบที่กำหนดเองจะถูกสร้างขึ้น (หรือดีกว่า: ควรสร้างขึ้น) เพื่อใช้ภายใน FXML / SceneBuilder

person eckig    schedule 18.11.2014