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!相关推荐

  1. javafx 教程_JavaFX技巧6:使用透明颜色

    javafx 教程 为用户界面元素选择正确的颜色始终是一个巨大的挑战,但是当您开发可重用的框架控件时,开发人员就无法控制使用它们的应用程序的外观和感觉,这甚至更具挑战性. 尽管您可能总是将元素添加到默 ...

  2. javafx 教程_JavaFX,Jigsaw项目和JEP 253

    javafx 教程 因此, Java 9可能会破坏您的代码-- 如果您的项目使用JavaFX,则这尤其可能,因为许多自定义和自制控件都需要使用内部API. 借助Project Jigsaw,这些内容将 ...

  3. javafx 图标_JavaFX技巧32:需要图标吗? 使用Ikonli!

    javafx 图标 动机 自2013年以来,我一直在编写JavaFX应用程序和库的代码,它们的共同点是,我需要找到可以用于它们的良好图标/图形. 作为前Swing开发人员,我首先使用图像文件,GIF或 ...

  4. javafx阴影_JavaFX技巧来节省内存! 属性和可观察对象的阴影场

    javafx阴影 在 JavaFX的世界中, Properties API允许UI开发人员将值绑定到UI控件. 这种功能出奇的简单,但是当对象模型经常使用属性时,应用程序可能会很快耗尽内存. 我通常会 ...

  5. javafx 遮罩_JavaFX技巧31:遮罩/剪切/ Alpha通道

    javafx 遮罩 选择条 最近,我不得不实现一个自定义控件,该控件使用户可以从项目列表中选择一个项目. 此" SelectionStrip"控件必须水平放置项目,并且在项目过多的 ...

  6. javafx阴影_JavaFX技巧23:节省内存! 属性的阴影场

    javafx阴影 Java 8中引入的属性和属性绑定是非常有用的编程概念. 当您开发用户界面时,它们特别有用. 实际上,它们是如此有用,以至于开发人员成为所有事物都应该是属性而不是原始属性的想法的受害 ...

  7. javafx隐藏_JavaFX技巧14:StackPane子项-隐藏但不消失

    javafx隐藏 另一个简短提示:Swing提供了一个名为CardLayout的布局管理器,该管理器管理容器内的一组组件(卡),但始终仅显示其中一个. 方法CardLayout.show(Contai ...

  8. javafx属性_JavaFX技巧11:更新只读属性

    javafx属性 自定义控件通常具有"只读"属性. 这意味着不能从控件外部进行设置,甚至不能从自己的皮肤类别进行设置. 通常,控件的行为会导致更改只读属性. 在JavaFX中,此行 ...

  9. javafx 自定义控件_JavaFX技巧10:自定义复合控件

    javafx 自定义控件 用JavaFX编写自定义控件是一个简单直接的过程. 需要一个控件类来控制控件的状态(因此命名). 外观需要控件的外观. 而且通常不是用于自定义外观CSS文件. 控件的一种常见 ...

最新文章

  1. Python Qt GUI设计:将UI文件转换为Python文件的三种妙招(基础篇—2)
  2. 它指导了计算机行业大半个世纪的发展,如今却要走下神坛?
  3. 雅虎的Web优化最佳实践
  4. 【IDEA】怎么把idea的目录结构,以文本形式输出?
  5. Codeforces 746 G. New Roads
  6. 八大排序算法:插入(2:插入、希尔)、选择(2:选择、堆)、交换(2:冒泡、快速)、归并、基数
  7. (99)FPGA最大延迟与最小延迟基础
  8. linux内核nasm,在x86汇编代码,NASM,Linux中操作字符串
  9. Java4Android视频笔记
  10. 麦本本从u盘启动计算机,麦本本怎么设计u盘启动顺序
  11. 浪曦全部视频【截至4月14日】
  12. MobileNet-SSD网络解析
  13. 初识ABP vNext(1):开篇计划amp;基础知识
  14. 分享一个淘宝/天猫/京东/阿里 图片抓取工具
  15. 汉字Collection
  16. jQuery实现五星好评
  17. “玲珑杯”ACM 热身赛 # 2.5 A-B (数论)
  18. HTML基础总结笔记
  19. ShowMeAI —— Show u 三连
  20. 这次经济危机的一些看法

热门文章

  1. MATLAB恢复编辑器窗口停靠
  2. php与ui设计的区别,UI设计和平面设计的区别
  3. MIPS 的评估计算
  4. discuzX 3.4定制开发: 将composer更新到最新版本
  5. P2P网贷系统开发公司
  6. python 遗传算法 字符串_遗传算法——Python
  7. 如何使用Linux之快速入门
  8. Consider defining a bean of type ‘com.nclg.mall.service.AdminService‘ in your configuration.
  9. 中国年轻人与日本年轻人有什么不同
  10. python代码运行不了怎么办_Python编程之运行出错怎么办