2013-10-26 17 views
18

Tôi đang tạo một ứng dụng GUI javafx và dự án của tôi là một dự án được định cấu hình maven. Tôi muốn để có thể tham khảo file fxml của tôi như thế này trong các bộ điều khiển của tôi:Làm cách nào để tham khảo tệp javafx fxml trong thư mục tài nguyên?

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

đâu tập tin main.fxml của tôi nằm trong thư mục/nguồn src/main và bộ điều khiển của tôi là trong src/main/java thư mục. Làm thế nào để tôi đi về việc này? Thư mục src/main/resources của tôi nằm trong đường dẫn xây dựng và tôi có thể gọi một tệp .properties nằm trong thư mục src/main/resources từ một lớp trong thư mục src/main/java.

Sửa

Tôi đã cố gắng để đặt các tập tin fxml trong thư mục tương ứng của thư mục nguồn chính:

enter image description here

nhưng tôi vẫn có một lỗi.

Trả lời

57

sử dụng Ví dụ

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

tùy chọn độ phân giải Location

  1. Đặt tất cả các fxml của bạn trong/main thư mục/nguồn src.

    loader.setLocation(getClass().getResource("/main.fxml")); 
    
  2. Đặt tất cả fxml của bạn vào thư mục src/main/resources/fxml.

    loader.setLocation(getClass().getResource("/fxml/main.fxml")); 
    
  3. Đặt fxml vào thư mục tài nguyên tương ứng; ví dụ. src/main/resources/com/mycompany/myapp.

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

Tùy chọn cuối cùng giả định rằng các lớp từ mà bạn đang tải fxml nằm ở vị trí tương đối giống nhau trong hệ thống phân cấp nguồn Java tương ứng. Ví dụ, bạn có thể gọi lệnh tải cuối cùng từ nguồn com.mycompany.myapp.Main.java.

sử dụng FXMLLoader khuyến nghị

  1. Khởi tạo một FXMLLoader qua new FXMLLoader() hơn là sử dụng các static methods on the FXMLLoader.

    • Các phương pháp tĩnh trở nên khó hiểu khi bạn muốn get values (như instantiated điều khiển) ra khỏi một bộ nạp.
  2. Set the location trên FXMLLoader instantiated và gọi load() chứ không phải tải từ một dòng sử dụng load(stream).

    • Đặt vị trí dựa trên URL trên trình tải cho phép giải quyết tài nguyên tương đối được tải trong tệp fxml và css. Các tài nguyên tương đối không giải quyết được đối với một hàm tạo dựa trên luồng.
  3. Để lấy được một vị trí dựa trên một lớp, sử dụng getClass().getResource(), vì nó là dựa trên URL, chứ không phải là getClass().getResourceAsStream() là luồng dựa.

IDE và Xây dựng Cài đặt

Đảm bảo rằng IDE của bạn hoặc xây dựng công cụ được sao chép các tập tin fxml từ thư mục tài nguyên vào thư mục build đầu ra. Để biết cài đặt Intellij cho việc này, hãy xem: How to convert a normal java project in intellij into a JavaFx project.

+0

Bạn vẫn đang sử dụng phương pháp tĩnh trong ví dụ của mình. Bạn cần gọi getResourceAsStream thay vì getResource –

+2

Cảm ơn Felix, đã sửa và làm rõ câu trả lời. 3 năm và 28 upvotes và không ai đã chỉ ra điều này bất thường trong câu trả lời ban đầu trước ;-) – jewelsea

+0

Tất cả thời gian này, nó đã thất bại vì tôi đã không đặt '/' trước khi bắt đầu thư mục. I E. 'getClass(). getResource (" fxml/main.fxml ")'. – sudoman

4

Bạn đang sử dụng FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("main.fxml")); để tải tệp main.fxml của mình. Điều này yêu cầu main.fxml và lớp java tải nó trong cùng một thư mục/đường dẫn. Nếu bạn muốn tải một tệp fxml từ một đường dẫn/vị trí khác với lớp java đang tải nó, bạn cần sử dụng đường dẫn tương đối. Như @jewelsea đã đề cập ở trên, bạn có thể sử dụng đường dẫn tương đối bằng cách sử dụng/ký tự trước tệp main.fxml của bạn. Vì vậy, mã sẽ làm cho mã hoạt động cho bạn trong trường hợp của bạn là

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

Mở thư mục tài nguyên trong trình khám phá tệp của hệ điều hành của bạn. Ở đây bạn sẽ thấy rằng bạn đã tạo một thư mục "dominion.application" thay vì thư mục "application" bên trong thư mục "dominion". Bởi vì điều này "MainController" lớp được đặt trong một gói khác nhau như các tập tin fxml.

Các vấn đề liên quan