Bạn có thể set stylesheets on Parent nodes sử dụng:
parent.getStylesheets().add("/resources/shell.css");
Bởi vì các yếu tố và các thuộc tính có thể sử dụng trong FXML có nguồn gốc từ công chúng API JavaFX Java, sau đó bạn cũng có thể gán stylesheets để một nút chuyên sử dụng một stylesheets FXML phần tử (hoặc hoán đổi cho nhau một thuộc tính). Như tất cả các container mở rộng cha mẹ, bạn có thể đặt một hoặc nhiều kiểu tuỳ chỉnh trên bất kỳ container bạn tham khảo trong FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import java.net.URL?>
....
<?scenebuilder-stylesheet fruitcombo.css?>
<AnchorPane prefHeight="205.0" prefWidth="168.0"
styleClass="layout"
fx:controller="fruit.FruitComboController"
xmlns:fx="http://javafx.com/fxml">
<children>
....
</children>
<stylesheets>
<URL value="@fruitcombo.css" />
</stylesheets>
</AnchorPane>
Xem file fxml trong this sample cho một mẫu thực thi hoàn chỉnh các tham chiếu tới một file css từ một file fxml.
Có một vài tốt đẹp để có các tính năng trong đoạn code trên:
Các lạ @
tiền tố trong URL stylesheets là không cần thiết đúng, nhưng có thể được sử dụng để tận dụng lợi thế của JavaFX của location resolution. "Toán tử phân giải vị trí (được biểu thị bằng tiền tố" @ "với giá trị thuộc tính) được sử dụng để chỉ định rằng giá trị thuộc tính phải được coi là vị trí tương đối với tệp hiện tại chứ không phải chuỗi đơn giản".
Các dòng sau không cần lúc chạy, nhưng được sử dụng bởi SceneBuilder tool để xác định vị trí các stylesheet css cần thiết vào thời điểm thiết kế nếu bạn đang sử dụng công cụ:
<?scenebuilder-stylesheet fruitcombo.css?>
Cập nhật về những nhận xét
Cảnh báo: Đó là FXML 1.0, nó không hoạt động trong 2.0, javafx.fxml.LoadException: URL không phải là loại hợp lệ.
Nhận xét này hơi sai một chút. Theo tôi biết, hiện tại không có điều gì như FXML 2.0.
Lý do người nhận xét nhận được một LoadException là do đoạn mã chỉ định trong bài đăng này không nhập lớp java.net.URL
vào tài liệu FXML. Tôi đã cập nhật đoạn mã để bao gồm nhập java.net.URL
và thêm một số dấu chấm lửng khác ....
để làm rõ mục đích của đoạn mã. An ellipsis có nghĩa là "một loạt các chấm thường chỉ ra một thiếu sót có chủ ý của một từ, câu, hoặc toàn bộ phần từ một văn bản mà không làm thay đổi ý nghĩa ban đầu của nó".
Để hiểu rõ nhất câu trả lời này, bạn nên biên dịch và chạy mã mẫu được liên kết.
Cảnh báo không nên sử dụng chức năng tải InputStream trong FXMLLoader
tôi khuyên xây dựng một mới FXMLLoader với một vị trí, thay vì sử dụng FXMLLoader.load(InputStream) chức năng. Khi sử dụng hàm tải tĩnh(), thì các tham chiếu vị trí tương đối không thể được giải quyết vì không có vị trí cơ sở cho tệp FXML.
Tức là, không làm:
InputStream input = this.getClass().getResourceAsStream("layout.fxml");
FXMLLoader loader = new FXMLLoader.load(input);
Parent content = loader.load();
Thay vì làm:
String url = this.getClass().getResource("layout.fxml").toExternalForm();
FXMLLoader loader = new FXMLLoader(url);
Parent content = loader.load();
Tôi thích cách này ngắn gọn hơn (và dễ dàng hơn để truy tìm, vì nó phải nằm trong thẻ mở) so với phương thức ' stylesheets>'. –
gbmhunter