2014-07-25 31 views
11

JavaFX'in FXML seslerini kullanarak MVC Modeli harika ve harika görünüyor ancak proje paketlerimi nasıl düzenleyeceğimi bulmakta zorlanıyorum.JavaFX Proje Yapısı

i JavaFX ile ilgili bulmak her bir öğretici yol çok basit ve örgütsüzdür: Onlar sadece BİR paketi oluşturmak ve orada her şeyi yaratmak, her kontrolör, her fxml, her css. Bunu istemiyorum. Ben şeylerin doğru yerlerinde olmasını istiyorum.

Yine JavaFX yönettiği "pathing" "limitive" ... görünüyor. URL'lerin kullanımı, kaynaklarımı yerel dosyalarla sınırlamak istiyorsam, getClass().getResource("foo.fxml").openStream() öğesinin tamamını yapmam gerekiyor. Bu harika, ama bir sınıf yolundan kaynak elde ederek, yol sınıfın içinde bulunduğu paketten. Projenin kökünü istedim. Bu benim hayatımı kolaylaştıracaktı, ama JavaFX böyle çalışmıyor.

Bir FXML "Giriş Ekranı" sahip düşünün:

pratik bir örnek almak sağlar. Giriş Ekranı'nın bir stil sayfasını kullanmasını istiyorum. İdeal olarak, bu css bu fxml'nin aynı paketinde olurdu. Ama aynı .css'i başka bir FXML'de kullanmak istersem ne olur? Bu, her iki FXML'i aynı pakete koymam gerektiği anlamına mı geliyor? Açıkçası ben "gerek yok", ama nasıl yaparım?

Ayrıca, düzgün bir şekilde giriş yaptığımda sahneyi değiştirmek istediğimi söyleyebilirim. FXML Denetleyici doğru olayında, bir "setScene" çağırmak zorunda kalacaktım. FXML'lerin farklı paketlerde olması durumunda bu yolun elde edilmesi de zor olacaktır. Sadece her şey bir dev şişirilmiş paket içinde ya da "../../dir" gibi kesmelere başvurmadan erişilmesi zor bir şey gibi görünüyor. uygulama, tek TabPane olmasına rağmen

http://docs.oracle.com/javafx/2/best_practices/jfxpub-best_practices.htm Henley satış uygulaması, iyi organize uygulamanın bir örnek olarak görünmektedir. Talihsizce (en azından sanırım) kaynak açık değil. Onun fikri böyle bir şey olur:

client 
    Main.class 
    styles.css 
     client.images 
      image.png 
     client.screen1 
      Screen1.fxml 
      Screen1Controller.java 
     client.screen2 
      Screen2.fxml 
      Screen2Controller.java 
     ... 

Bu kötü bir başlangıç ​​gibi görünüyor doenst, ancak birkaç sorun vardır (ya da en azından ben sorunlar olarak onları bakınız). 'Henley Satış' için

Onun paketlerin FXML birini çağırır bir Main olması akıllı (kolay erişim, FXML en dizinleri Ana sınıfından altındadır). Yine de, stil sayfası için, bu scene.getStylesheets().add(...); tarafından kodlanmış olması gerekir. FXML'de stil sayfamı seçmeyi tercih ederim. Afterall, stil sayfası Görünüm bileşeninin bir parçasıdır. FXML'lerdeki bir URL'den .css dosyasına erişilmesi, bu dizinde yukarıda belirtilen dizinlerden beri zor olabilir.

Ayrıca, bu kuruluşla, sahneyi nasıl hassas bir şekilde değiştirebilirim? Bu projede, bu gerekli değildir çünkü tüm proje tek bir TabbedPane'dir. Ana çağırıyor ve bitti. Daha fazla takasa gerek yok. Ancak sahnede basit bir Oturum (veya birisinin tüm sahneyi değiştirmek için gerekenin nedeni ne olursa olsun) FXML yollarına erişme ihtiyacını gerektiriyor.

Ve kaynaklar var. Css dosyalarının görüntüleri kullanması gerekebilir. Bu yapı, .css dosyasını üstüne yerleştirerek ve sadece .css'nin ihtiyaç duyabileceği dosyalar için bir paket oluşturarak çözer. Belirli bir FXML'nin farklı bir .css olmasını istemiş olsaydım, başka bir sorun gelirdi.

Bir döngü gibi görünüyor. Css'nin paylaşılan bir kaynak klasörüne erişmesi gerekiyor. FXML'nin Css'ye erişmesi gerekiyor. FXML denetleyicilerinin diğer FXML'lere erişmesi gerekir. Umarım proje yapılarım hakkında şüphelerim vardı. Lütfen, temelden daha fazla bir uygulama için yeterince güçlü olan veya beni iyi bir kaynak koduna yönlendiren bir JavaFX proje yapısı oluşturmama yardımcı olun.

Ah, Netbeans'ı bu arada kullanıyorum.

cevap

23

IMHO, ekranınızın ekranına bağlı olarak paket oluşturmamalısınız!

ait controllers tekabül için böyle uygulamalar

  • Bir paket yönelik yaklaşımım bu views
  • Farklı paket hizmetinde (iş) ve dao için (dayanıklılık) tabakası, eğer
  • bir paket/klasör için var resim, css gibi kaynaklar
  • kaynaklarında fxml için view adı verilen bir paket
    src/main/java 
        | 
        controllers 
        | 
        Screen1controller.java 
        Screen2controller.java 
        service 
        | 
        Service1.java 
        dao(persist) 
        | 
        SaveProducts.java 
    src/main/resources 
        | 
        view 
        | 
        screen1.fxml 
        screen2.fxml 
        css 
        | 
        style.css 
        | 
        images 
        | 
        img1.jpg 
        img2.jpg 
    

Yukarıdaki uygulamabir Maven proje için kabul edilebilir.

Basit bir proje için, bir structure here görüntüleyebilirsiniz. Bu bir maven projesi!

+0

Hmm bu ilginç görünüyor, css bir FXML'deki bir URL'den ulaşılması zor gibi görünse de (biraz rahatsız ettiğim ../ şeyi yapmadığım sürece ...). Kaynakları, görüş paketinden sonra koyabiliyordum. Kaynaklar, Görüşün bir parçası olduğu için mantıklı. Servis ve DAO'nun ne için olduğunu bilmiyorum, bana bir örnek verebilir misin? (Oluşturulacak uygulama, veri almak ve saklamak için bir MySQL sunucusu kullanıyor) – Xkynar

+0

Daha fazla netlik için cevabımı güncelledim! – ItachiUchiha

+0

Bu yaklaşımın dezavantajı, görünüm ve denetleyicilerin aynı dizinde bulunmaması ve SceneBuilder'in bunları bağlayamamasıdır. ScreenBuilder gerektirmezse, fxml'i kaynak klasörüne koyardım. – ChrLipp