2013-02-04 29 views
13

Trong HTML, chúng tôi được sử dụng để niceties của việc có thể để thiết lập stylesheets lập trình nhưstylesheets Setting khai báo trong FXML

<link rel="stylesheet" ... > 

Nhưng ví dụ về thiết stylesheets tôi tìm thấy cho JavaFX cần thiết stylesheets lập trình, như

scene.getStylesheets().add("/resources/shell.css"); 

Có thể đặt các bản định kiểu trong FXML tương tự như cách được thực hiện trong HTML không?

Trả lời

13

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(); 
11

Có, xem ví dụ Ví dụ 4-8 của this tutorial, bằng cách áp dụng các thuộc tính sau để một nút:

stylesheets="fxmlexample/Login.css" 

ví dụ

<GridPane stylesheets="fxmlexample/Login.css"> 
+1

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 ''. – gbmhunter

0

Nếu bạn đang sử dụng fxml với JavaFX bạn nên dành thời gian để tải về và sử dụng SceneBuilder. Một khi bạn làm điều đó, việc sử dụng các bảng định kiểu css trở nên đơn giản. Tất nhiên, sử dụng NetBeans kể từ khi với SceneBuilder đang chạy, mở tệp dxml dựng sẵn trong ứng dụng netplate dxml của NetBeans làm cho nó tự động mở để chỉnh sửa trong SceneBuilder. Một khi bạn đã tách ra tất cả các StackPlane, nút và nhãn và đặt trong các điều khiển và container bạn thực sự muốn, chỉ cần thêm bảng định kiểu trực tiếp vào SceneBuilder. Trong menu chính, trong phần Xem trước, có một lựa chọn menu cho các tờ định kiểu CSS. Lựa chọn nó sẽ trả về một menu con, nó sẽ cho phép bạn tải một tệp bảng định kiểu.

Khi tệp được tải, các điều khiển sẽ hiển thị để được làm da theo các quy tắc trong biểu định kiểu, chúng sẽ không hiển thị làn da đó cho đến khi bạn chọn từng phần trong phần thuộc tính của SceneBuilder và khai báo kiểu trang đó để kiểm soát đó. Sau đó, kiểu sẽ hiển thị khi ứng dụng chạy.

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