2013-10-26 21 views
18

Bir javafx GUI uygulaması oluşturuyorum ve projem, maven yapılandırılmış bir projedir. Benim main.fxml dosya src/main/resources klasöründe bulunan ve benim denetleyicisi src/main/java halindedirKaynak klasöründeki javafx fxml dosyalarını nasıl başvuruyorsunuz?

FXMLLoader.load(getClass().getResource("main.fxml"); 

: Ben denetleyicileri böyle benim fxml başvuru dosyalarına isterler Klasör. Bunu yapmayı nasıl yaparım? Src/main/resources klasörüm yapı yolunda ve src/main/java klasöründeki bir sınıftaki src/main/resources klasöründe bulunan bir .properties dosyasını çağırabilirim.

enter image description here

ama hala bir hata var:

Düzenleme ana kaynakları klasörünün gelen dizinde fxml dosyasını yerleştirmek için çalıştı.

cevap

57

Örnek kullanım

FXMLLoader loader = new FXMLLoader(); 
loader.setLocation(getClass().getResource("/main.fxml")); 
Parent content = loader.load(); 

Yer çözünürlük seçenekleri

  1. src/main/kaynaklar dizininde fxml tüm koyun.

    loader.setLocation(getClass().getResource("/main.fxml")); 
    
  2. bir src/main/resources/fxml dizindeki fxml tüm koyun.

    loader.setLocation(getClass().getResource("/fxml/main.fxml")); 
    
  3. Fxml'i karşılık gelen bir kaynak dizinine yerleştirin; Örneğin. src/main/resources/com/firmam/myapp.

    loader.setLocation(getClass().getResource("main.fxml")); 
    

son seçenek fxml yüklüyorsunuz hangi sınıf tekabül Java kaynak hiyerarşisinde aynı göreli konumda olduğunu varsayar. Örneğin, son yük komutunu kaynak com.mycompany.myapp.Main.java'dan çağırabilirsiniz.

FXMLLoader kullanım önerileri

  1. yerine static methods on the FXMLLoader kullanmak yerine new FXMLLoader() yoluyla bir FXMLLoader örneğini. Eğer bir yükleyicinin dışarı get values için (örneği kontrolörleri gibi) istediğinizde

    • statik yöntemler kafa karıştırıcı hale .
  2. örneği FXMLLoader ile Set the location ve load() yerine akışından yüklenmesi load(stream) kullanarak çağrı.yükleyici bir URL tabanlı konum ayarlama

    • fxml ve css dosyalarında yüklenen göreli kaynakların çözümü için izin verir. Göreli kaynakları, akış tabanlı bir kurucu için çözümlenmez. getClass().getResource() kullanımı URL'nin bazlı olduğu
  3. bazlı akış yerine getClass().getResourceAsStream() olan, bir sınıfa göre bir konum türetmek.

IDE ve İnşa Ayarlar

IDE aracı inşa çıktı dizine kaynak dizinden fxml dosyaları kopyalıyor oluşturmak veya emin olun. Bunun için Intellij ayarlarını anlamak için bkz .: How to convert a normal java project in intellij into a JavaFx project.

+0

Örneğinizde hala statik yöntemi kullanıyorsunuz. GetResourceAsStream öğesini getResource –

+2

yerine aramanız gerekiyor. Teşekkürler Felix, cevabı düzeltip açıklığa kavuşturdu. 3 yıl ve 28 upvot ve hiç kimse orijinal cevapta bu anormalliği işaret etmemişti ;-) – jewelsea

+0

Bütün bunlar başarısız oldu çünkü başlangıç ​​klasöründen önce '/' koymadım. Yani 'GetClass(). GetResource ("fxml/main.fxml") '. – sudoman

4

Anas.fxml'inizi yüklemek için FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("main.fxml")); kullanıyorsunuz. Bu main.fxml ve aynı dizinde/yolunda yüklenen java sınıfını gerektirir. Bir fxml dosyasını, yüklenen java sınıfından farklı bir yoldan/konumdan yüklemek istiyorsanız, göreli yolu kullanmanız gerekir. Yukarıda bahsettiğimiz gibi, main.fxml'inizden önce/karakterini kullanarak göreceli yolu kullanabilirsiniz. Yani sizin durumda sizin için çalışmasını yapacak kod

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/main.fxml")); 
0

senin işletim sistemi dosya gezgini içinde kaynakları klasörü açın olduğunu. Burada bir "dominion" klasörü içinde bir "uygulama" klasörü yerine "dominion.application" klasörü oluşturduğunuzu göreceksiniz. Bu nedenle "MainController" sınıfı fxml dosyası olarak farklı bir pakete yerleştirilmiştir.

İlgili konular