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 图标

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java安全 ——JAAS(Java 认证和授权服务)开发指南

以下内容转自&#xff1a; http://lyb520320.iteye.com/blog/720478【0】README1&#xff09;本文翻译自&#xff1a;http://java.sun.com/developer/technicalArticles/Security/jaasv2/2&#xff09;传统的JAVA安全机制没有提供必要的架构支持传统的认证和授权&#xff1b;在…

aws dynamodb_AWS Lambda将数据保存在DynamoDB中

aws dynamodb在本教程中&#xff0c;我们将看到如何使用AWS Lambda将数据保存在Dynamo DB中。 这是必需的步骤&#xff1a; – 在Dynamo数据库中创建一个名为Employee的表 –创建一个AWS Lambda函数&#xff0c;该函数可以使用Dynamo DB中的Employee POJO保存员工的名字和姓…

Tomcat处理一个HTTP请求的过程

一、Tomcat的组成 &#xff08;1&#xff09;Server服务器元素代表整个catalina servlet容器。是单例模式。 &#xff08;2&#xff09;ServiceService是这样一个集合&#xff1a;它由一个或者多个Connector组成&#xff0c;以及一个Engine&#xff0c;负责处理所有Connector所…

java安全——数字签名+代码签名

【0】README1&#xff09;本文文字描述转自 core java volume 2, 旨在学习 java安全——数字签名 的基础知识&#xff1b;2&#xff09;本文实践内容以及截图笔记均为原创&#xff1b;3&#xff09;如果要给予applet更多的信赖&#xff0c;你必须知道下面两件事&#xff1a; 3.…

//rest风格写_REST /使用提要发布事件

//rest风格写处理事件 当使用多个解耦的服务时&#xff08;例如&#xff0c;在微服务体系结构中 &#xff09;&#xff0c;很有可能需要一种方法来将某种域事件从一个服务发布到一个或多个其他服务。 许多广泛采用的解决方案依赖于单独的基础结构来解决此问题&#xff08;例如…

Java IO总结

一、IO的类型 面向字节的流&#xff0c;面向字符的流二、面向字节的流 &#xff08;1&#xff09;InputStream FileInputStream FilterInputStream -BufferedInputStream -DataInputStream -PushbackInputStream 回退流 unread() ObjectInputStream PipedInputSt…

java安全——加密

【0】README1&#xff09;本文文字描述转自 core java volume 2&#xff0c;旨在学习 java安全——加密 的基础知识&#xff1b;2&#xff09;java 安全性的第二个重要方面是加密。3&#xff09;认证对于代码签名已足够了-没必要将代码隐藏起来。但是&#xff0c;当applet或者应…

java 异常 最佳实践_处理Java异常的10种最佳实践

java 异常 最佳实践在本文中&#xff0c;我们将看到处理Java异常的最佳实践。 用Java处理异常不是一件容易的事&#xff0c;因为新手很难理解&#xff0c;甚至专业的开发人员也可能浪费时间讨论应该抛出或处理哪些Java异常。 因此&#xff0c;最大的开发公司对如何使用它们有一…

Java NIO总结

一、NIO NIO是new IO&#xff0c;也是非阻塞IO。有Channel、Selector、Buffer、Pipe、FileLock等类。 Buffer在java.nio包 Channel、Selector、Pipe、FileLock等在java.nio.channels包 二、Channel通道 设置非阻塞configureBlocking(false); 注册选择器register(selector,…

java 不可变map_如何用Java创建不可变的Map

java 不可变map你好朋友&#xff0c; 在本教程中&#xff0c;我们将看到如何在Java中创建不可变的Map。 –不可变的类或对象是什么意思&#xff1f; –什么是不可变地图&#xff1f; –如何在Java中创建不可变的Map&#xff1f; 不变的类或对象是什么意思&#xff1f; 不可…

ToolProvider.getSystemJavaCompiler() return null 的解决方法

【1】利用java 编译器API 编译 普通的java文件 1.1&#xff09;代码如下&#xff1a; package com.corejava.chapter10_2;import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStream;import javax.tools.JavaCompiler; import jav…

脚本错误和安全警报怎么解决_适用于应用程序错误的AWS警报

脚本错误和安全警报怎么解决监视对于任何实际应用都是关键的。 您必须知道正在发生的事情&#xff0c;并在发生问题时实时得到警报。 AWS为此提供了CloudWatch&#xff0c;并自动为您提供了许多指标。 但是&#xff0c;您必须定义一些自己的东西。 然后&#xff0c;您需要定义适…

java平台脚本+java编译器API

【0】README 0.1&#xff09;本文文字描述转自 core java volume 2&#xff0c; 旨在学习 java平台脚本java编译器API 的 基础知识&#xff1b; ------------------------------------------------------------------------------ 【1】java平台的脚本 1&#xff09;脚本语…

Java 多线程总结

一、多线程实现方式 &#xff08;1&#xff09;继承Thread类&#xff0c;覆盖run方法 &#xff08;2&#xff09;实现Runnable接口&#xff0c;覆盖run方法&#xff0c;将对象传人Thread对象中实现Runnable接口比继承Thread类所具有的优势&#xff1a; 1&#xff09;适合多个相…

古巴比伦乘法_古巴:为生产做准备

古巴比伦乘法“它可以在我的本地机器上运行&#xff01;” 如今&#xff0c;它听起来像模因&#xff0c;但是“开发环境与生产环境”的问题仍然存在。 作为开发人员&#xff0c;您应始终牢记&#xff0c;您的应用程序有一天将在生产环境中开始运行。 在本文中&#xff0c;我们将…

java编译器API——使用编译工具

【0】README 0.1&#xff09;以下内容转自&#xff1a; http://suntips.iteye.com/blog/69002 0.2&#xff09;for basic java compiler API, please visit http://blog.csdn.net/pacosonswjtu/article/details/50718494 1&#xff09;当你需要更好的处理这些结果时,你可以使…

Java 线程同步总结

一、synchronized&#xff08;1&#xff09;synchronized方法 &#xff08;2&#xff09;synchronized块 二、Lock 注意&#xff1a;及时释放Lock锁&#xff0c;否则会出现死锁&#xff0c;通常在finally代码释放锁 &#xff08;1&#xff09;ReentrantLock 实现…

aws es方案_AWS Elasticsearch后模式

aws es方案碰巧我们在SaaS版本的LogSentinel上遇到了生产问题–我们的Elasticsearch停止了对新数据编制索引。 由于Elasticsearch只是辅助存储&#xff0c;因此没有数据丢失&#xff0c;但这给我们的客户带来了一些问题&#xff08;他们无法在其仪表板上看到实时数据&#xff0…

java注解总结

【0】README 0.1&#xff09;本文主要对 java 注解做总结&#xff1b; 【1】处理注解的级别 level1&#xff09; 在运行期级别处理注解&#xff1a; http://blog.csdn.net/pacosonswjtu/article/details/50719361level2&#xff09;在源码级别处理注解&#xff1a; http://b…

Java 类加载总结

一、类加载过程 装载链接验证准备解析初始化二、类初始化情况 1&#xff09;创建类的实例&#xff0c;也就是new一个对象 2&#xff09;访问某个类或接口的静态变量&#xff0c;或者对该静态变量赋值 3&#xff09;调用类的静态方法 4&#xff09;反射&#xff08;Class.…