JavaFX - CSS樣式
第4部分主題
- CSS樣式表
- 添加應用程序圖標
CSS樣式表
在JavaFX中,你能使用層疊樣式表修飾你的用戶接口。這非常好!自定義Java應用界麵從來不是件簡單的事情。
在本教學中,我們將創建一個DarkTheme主題,靈感來自於Windows 8 Metro設計。按鈕的CSS來至於Pedro Duque Vieia的博客Java中JMetro-Windows 8 Metro控件。
熟悉CSS
如果你希望修飾你的JavaFX應用,通常你應該對CSS有一個基本的了解。一個好的起點是CSS教學.
關於CSS更多JavaFX指定信息:
- 使用CSS換膚JavaFX應用 - Oracle教學
- JavaFX CSS參考 - 官方
缺省的JavaFX CSS
在JavaFX 8中缺省的CSS風格源碼是一個稱為modena.css
文件。該CSS文件可以在JavaFX jar文件jfxrt.jar
中找到,它位於Java目錄/jdk1.8.x/jre/lib/ext/jfxrt.jar
。
解壓jfxrt.jar
,你應該能在com/sun/javafx/scene/control/skin/modena/
目錄下找到modena.css
。
缺省的樣式表總是應用到JavaFX應用上。通過添加自定義樣式表,你能覆蓋modena.css
中缺省的樣式。
添加CSS樣式表
添加下麵的CSS文件DarkTheme.css
到view
包中。
DarkTheme.css
.background { -fx-background-color: #1d1d1d; } .label { -fx-font-size: 11pt; -fx-font-family: "Segoe UI Semibold"; -fx-text-fill: white; -fx-opacity: 0.6; } .label-bright { -fx-font-size: 11pt; -fx-font-family: "Segoe UI Semibold"; -fx-text-fill: white; -fx-opacity: 1; } .label-header { -fx-font-size: 32pt; -fx-font-family: "Segoe UI Light"; -fx-text-fill: white; -fx-opacity: 1; } .table-view { -fx-base: #1d1d1d; -fx-control-inner-background: #1d1d1d; -fx-background-color: #1d1d1d; -fx-table-cell-border-color: transparent; -fx-table-header-border-color: transparent; -fx-padding: 5; } .table-view .column-header-background { -fx-background-color: transparent; } .table-view .column-header, .table-view .filler { -fx-size: 35; -fx-border-width: 0 0 1 0; -fx-background-color: transparent; -fx-border-color: transparent transparent derive(-fx-base, 80%) transparent; -fx-border-insets: 0 10 1 0; } .table-view .column-header .label { -fx-font-size: 20pt; -fx-font-family: "Segoe UI Light"; -fx-text-fill: white; -fx-alignment: center-left; -fx-opacity: 1; } .table-view:focused .table-row-cell:filled:focused:selected { -fx-background-color: -fx-focus-color; } .split-pane:horizontal > .split-pane-divider { -fx-border-color: transparent #1d1d1d transparent #1d1d1d; -fx-background-color: transparent, derive(#1d1d1d,20%); } .split-pane { -fx-padding: 1 0 0 0; } .menu-bar { -fx-background-color: derive(#1d1d1d,20%); } .context-menu { -fx-background-color: derive(#1d1d1d,50%); } .menu-bar .label { -fx-font-size: 14pt; -fx-font-family: "Segoe UI Light"; -fx-text-fill: white; -fx-opacity: 0.9; } .menu .left-container { -fx-background-color: black; } .text-field { -fx-font-size: 12pt; -fx-font-family: "Segoe UI Semibold"; } /* * Metro style Push Button * Author: Pedro Duque Vieira * http://pixelduke.wordpress.com/2012/10/23/jmetro-windows-8-controls-on-java/ */ .button { -fx-padding: 5 22 5 22; -fx-border-color: #e2e2e2; -fx-border-width: 2; -fx-background-radius: 0; -fx-background-color: #1d1d1d; -fx-font-family: "Segoe UI", Helvetica, Arial, sans-serif; -fx-font-size: 11pt; -fx-text-fill: #d8d8d8; -fx-background-insets: 0 0 0 0, 0, 1, 2; } .button:hover { -fx-background-color: #3a3a3a; } .button:pressed, .button:default:hover:pressed { -fx-background-color: white; -fx-text-fill: #1d1d1d; } .button:focused { -fx-border-color: white, white; -fx-border-width: 1, 1; -fx-border-style: solid, segments(1, 1); -fx-border-radius: 0, 0; -fx-border-insets: 1 1 1 1, 0; } .button:disabled, .button:default:disabled { -fx-opacity: 0.4; -fx-background-color: #1d1d1d; -fx-text-fill: white; } .button:default { -fx-background-color: -fx-focus-color; -fx-text-fill: #ffffff; } .button:default:hover { -fx-background-color: derive(-fx-focus-color,30%); }
現在我們需要把CSS添加到我們的場景中。我們能在Java代碼中編程完成,但是我們將使用SceneBuilder來添加它到fxml文件中。
添加CSS到RootLayout.fxml
-
在Scene Builder中打開
RootLayout.fxml
-
在Hierarchy視圖中選擇根節點
BorderPan
。在Properties組中添加DarkTheme.css
作為樣式表。
添加CSS到PersonEditDialog.fxml
-
在Scene Builder中打開
PersonEditDialog.fxml
。選擇根節點AnchorPane
,並且在Properties組中選擇DarkTheme.css
作為樣式表。 -
背景仍然是白色的,因此添加樣式類
background
到根節點AnchorPane
。
- 選擇OK按鈕,在Properties視圖中選擇Default Button單選框。這將修改它的顏色,當用戶輸入關鍵詞時,使用它作為缺省的按鈕。
添加CSS到PersonOverview.fxml
-
在Scene Builder中打開文件
PersonOverview.fxml
。在Hierarchy組中選擇根節點AnchorPane
。在Properties下麵添加DarkTheme.css
文件作為樣式表。 -
你現在應該已經看到一些修改,表和按鈕是黑色的。來自
modena.css
中所有類樣式.table-view
和.button
應用到表和按鈕。因為我們已經在自定義CSS中重定義(因此覆蓋掉)一些樣式。新的樣式自動應用。 -
你可能需要調整按鈕的大小,以便顯示所有的文本。
-
選擇
SplitPane
中右邊的AnchorPane
。 -
進入到Properties組,並且選擇
background
作為樣式表。背景現在應該變為黑色。
使用不同樣式的標簽
現在,在左邊的所有的標簽都有相同的大小。這裡已經有一些樣式定義在CSS文件中,稱為.label-header
和.label-bright
。我們將使用更多樣式的標簽Label。
-
選擇Person Detail標簽,添加
label-header
作為樣式類。 -
為了讓右邊欄的每個Label(顯示實際人員的詳情),添加CSS樣式類
label-bright
。
添加應用圖標
現在,在標題欄和任務欄中,我們的應用隻有一個缺省圖標:
使用自定義圖標看起來更好了。
圖標文件
獲取圖標的一個可能地方是Icon Finder。我下載了一個地址本的圖標.
通常在你的AddressApp項目中創建一個目錄稱為resources,在它中子目錄稱為images。把你選擇的圖標放入到images目錄中。現在,你的目錄結構應該看上去如下所示:
設置圖標到場景
為了給你場景設置圖標,添加下麵一行到MainApp.jar
的start(…)
方法中。
MainApp.java
this.primaryStage.getIcons().add(new Image("file:resources/images/address_book_32.png"));
現在,整個start(…)
方法看上去應該是這樣的。:
public void start(Stage primaryStage) { this.primaryStage = primaryStage; this.primaryStage.setTitle("AddressApp"); // Set the application icon. this.primaryStage.getIcons().add(new Image("file:resources/images/address_book_32.png")); initRootLayout(); showPersonOverview(); }
當然,你也應該添加圖標到人員編輯對話框的Stage中。