javafx 图标_JavaFX技巧32:需要图标吗? 使用Ikonli!
javafx 圖標
動機
自2013年以來,我一直在編寫JavaFX應用程序和庫的代碼,它們的共同點是,我需要找到可以用于它們的良好圖標/圖形。 作為前Swing開發人員,我首先使用圖像文件,GIF或PNG。 通常,我會從IconExperience( www.incors.com )許可類似“ O-Collection”的庫。 但是很快對我來說,使用圖像文件太痛苦了。
試想一下,您想支持節點的不同偽狀態(例如,“懸停”,“按下”,“集中”)。 您最終會為每個州使用同一圖標的不同版本。 如果要支持不同大小(小,中,大)或屏幕分辨率(例如Mac上的“ Retina Display”,2x圖標),則需要更多文件。 最終,您最終陷入了圖像文件的地獄。
最初我并不在乎,因為我從框架開發開始。 CalendarFX或FlexGanttFX之類的項目僅需要很少的圖標。 因此,將PNG文件用于這些庫不是問題。 但是,一旦我開始從事較大的項目,就需要支持數百個圖標。
圖標字體
幸運的是,我們所有人都已經為該問題提出了解決方案,該解決方案稱為“圖標字體”。 圖標字體的最大優點是所有圖標都包含在一個文件中。 這使得在您的工作區中對其進行管理非常容易。 另一個優點是可以通過CSS設置字體圖標的樣式。 這樣,單個圖標可以以許多不同的顏色或大小顯示。
最流行的圖標字體,至少在開始的時候,是FontAwesome并有一個JavaFX實施叫FontAwesomeFX由延阻止。 我將這個庫用于我所有的項目很長時間了,從沒想過我需要其他任何東西。 直到我偶然發現了Andres Almiray出色的圖書館“ Ikonli”。 您可以在GitHub上找到它 。 之后,我將其用于所有與JavaFX相關的工作。 對于我的大型應用程序,也對于我的庫。
我喜歡Ikonli的地方在于,它與現有的JavaFX API無縫集成。 圖標只是“文本”節點(duh!)的擴展,并帶有可設置樣式的屬性。 圖標本身具有一些屬性,包括圖標“代碼”,其顏色和大小。 CSS文件中這些屬性的名稱也遵循約定。 在這里,它們被稱為-fx-icon-code,-fx-icon-color和-fx-icon-size。
積分
Ikonli不僅隨FontAwesome一起提供,而且總共提供31種(!)不同字體。 其中包括材料設計圖標,天氣圖標,付款圖標(信用卡等)。 其中的每一個都在各自的模塊/工件中,并且可以分別導入,例如通過Maven依賴項。 如果要使用Material Design圖標字體,則需要將以下依賴項添加到Maven項目的POM文件中。
< dependencies > < dependency > < groupId >org.kordamp.ikonli</ groupId > < artifactId >ikonli-javafx</ artifactId > < version >11.3.5</ version > </ dependency > </ dependencies > < dependency > < groupId >org.kordamp.ikonli</ groupId > < artifactId >ikonli-materialdesign-pack</ artifactId > < version >11.3.5</ version > </ dependency >備忘單
圖標字體通常帶有很多圖標。 因此,找到合適的人很困難。 Ikonli通過為每種字體提供一個“備忘單”來簡化此過程。 可以在下面看到“材料設計”圖標。
編碼
創建FontIcon節點/實例后,就可以在JavaFX場景圖中的任何位置使用它。 在下面,您將看到一個通過代碼將其設置在按鈕上的示例。
Button button = new Button( "User Account" ); button.setGraphic( new FontIcon()); button.setId( "account-button" );要設置圖標樣式,請將以下內容添加到CSS文件中:
#account-button .ikonli-font-icon { -fx-icon-code: "mdi-account" ; -fx-icon-color: blue; -fx-icon-size: 1.2em; }要在FXML文件中使用圖標,您可以編寫以下代碼:
<Button text= "User Account" id = "account-button" > <graphic> <FontIcon iconLiteral= "mdi-account" /> < /graphic > <Button>自定義字體
您還可以基于Ikonli為JavaFX創建自己的自定義圖標字體。 顯然,您需要的第一件事是字體文件。 有幾種在線服務可用于創建這種字體。 它們使您可以從各種現有字體中選擇圖標,但也可以使您上載自己的SVG文件。 我使用的一個叫做Fontello。 它具有三個主要區域:圖標選擇和/或上傳,自定義名稱,自定義代碼。
在線正確配置圖標后,即可將結果下載為ZIP文件。 在ZIP文件中,您會找到各種格式的圖標字體。
要驗證所有圖標實際上是否都位于字體內,您可以通過“字體簿”(在Mac上)打開文件。 它看起來應該像這樣:
圖標枚舉
為了使該字體在JavaFX應用程序中可用,您必須首先實現一個枚舉,每個圖標都有一個值。 它看起來類似于:
package com.acme.font; import org.kordamp.ikonli.Ikon; public enum MyIcon implements Ikon { HOUSE( "my-icon-house" , '\ue815' ), CAR( "my-icon-car" , '\ue816' ), DOG( "my-icon-dog" , '\ue817' ), CAT( "my-icon-cat" , '\ue818' ), KID( "my-icon-kid" , '\ue819' ); private String description; private char icon; MyIcon(String description, char icon) { this .description = description; this .icon = icon; } public String getDescription() { return description; } public char getCode() { return icon; } public static MyIcon findByDescription(String description) { for (MyIcon icon : values()) { if (icon.description.equals(description)) { return icon; } } throw new IllegalArgumentException( "Icon not supported: " + description); } }伊康·漢德勒
接下來要實現的是AbstractIkonHandler的擴展。 對于此示例,其中所有圖標文字均以“ my-icon”作為前綴,“ supports”方法將恰好返回該前綴。
package com.acme.font; import org.kordamp.ikonli.AbstractIkonHandler; import org.kordamp.ikonli.Ikon; public class MyIkonliHandler extends AbstractIkonHandler { public boolean supports(String description) { return description != null && description.startsWith( "my-icon-" ); } public Ikon resolve(String description) { return MyIcon.findByDescription(description); } public String getFontResourcePath() { return "com/acme/fonts/my-icons.ttf" ; } public String getFontFamily() { return "my-icons" ; } }服務查詢
現在剩下要做的就是使字體可供全世界使用。 這是通過服務查找完成的,這意味著您必須在文件夾META-INF / services中創建一個名為“ org.kordamp.ikonli.IkonHandler”的文件。 在此文件內,您需要添加處理程序類的完整類名(com.acme.font.MyIkonliHandler)。
例
以下屏幕截圖顯示了我們在Maven項目中使用的字體模塊。 您的項目應類似于此。
而已! 祝大家編碼愉快!
翻譯自: https://www.javacodegeeks.com/2020/03/javafx-tip-32-need-icons-use-ikonli.html
javafx 圖標
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的javafx 图标_JavaFX技巧32:需要图标吗? 使用Ikonli!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正在消失的光驱光驱不见了如何恢复
- 下一篇: aws dynamodb_AWS Lam