这个问题的答案确实有点个人品味,但有一些我认为有用的一般经验法则。
JavaFX 中的四个样式选项是:
- css 样式表。
- 从代码发出的 css setStyle 命令。
- 用于样式的java代码。
- 用于样式的 fxml 属性。
我的建议是:
- 几乎所有的样式都使用 css 样式表。
- 在您拥有数千个节点或您个人更喜欢 API 提供的类型安全和易于调试功能的地方使用 Java API 调用。
- 仅当您需要动态更改只能使用 CSS 设置且无法使用 API或样式表设置的样式时才使用 setStyle。
- 不要通过 fxml 应用样式。
使用 css 样式表进行样式设置的优点是:
- 您可以将样式与代码分开。
- 您可以轻松地定义多个样式表并在运行时将它们更改为进出,以使您的应用程序具有不同的外观。
- 您正在使用专门为样式设计的语言。
- 您可以在SceneBuilder等设计工具中应用样式表。
确实,如果您使用的是可视化设计工具,最后一点很重要——您确实需要使用 css 样式表来充分利用它。如果您在代码中而不是在 css 样式表中应用样式,那么当您尝试在可视化设计工具中设计应用程序时,您将无法真正看到应用程序的外观。如果您通过 fxml 属性应用样式,那么您的 fxml 将变得笨拙,因为它定义了应用程序的结构和布局以及它的样式 - 通常最好将这些问题分开。
我有时在我的代码中使用 setStyle 调用,但主要是因为懒惰而不是因为它是推荐的方法。
使用 setStyle 动态更改样式的需要应该是非常有限的情况。例如,在 JavaFX 2.2 中,您不能通过 API 设置区域的背景颜色。您可以使用样式类对其进行设置。但是如果你想动态地将背景颜色设置为用户选择的颜色,那么你可以使用这样的 setStyle 方法button.setStyle("-fx-text-fill: " + userColor.toString() + ";");
。所以,真的很专业。
另请注意,在 JavaFX 8 中,一些只能在 JavaFX 2.2 中通过 css 完成的事情(例如设置区域背景)将能够通过 Java API 在代码中完成。对于上面给出的为区域背景设置用户填充颜色的示例,如果使用 JavaFX 8,则使用 Java API 将是首选方法。
就各种用例的性能影响而言。我的理解(来自论坛中 JavaFX css 实现维护者的评论)在大多数情况下,从最高性能到最低性能的性能顺序如下所示:
- 直接 API 调用。
- 通过 FXML 样式。
- 通过 styleclass 应用的样式。
- setStyle 调用。
请注意,JavaFX 中的 css 应用程序设计得非常高效,因此在许多情况下,性能并不是主要考虑因素。我的猜测是,只有当你有数千个节点被设置样式时,使用 css 才会对性能产生重大影响,尽管我没有确凿的数据来支持这个猜测。
在过去,我看到一些 JavaFX 程序员的评论,他们不想使用 css,而是更喜欢使用 JavaFX API 来为他们的应用程序设计样式。给出的原因是为了更容易调试、使用单一语言的所有内容、更好地与 IDE 集成以帮助处理方法名称、编辑和编译时静态类型检查等。如果您更喜欢使用 Java API 而不是 css 进行样式设置由于您自己的代码中的这些原因,就目前而言,这很好。但是您根本无法仅使用 Java API 完成您需要的所有样式设置。
css 的使用以及如何在 JavaFX 中使用它的知识对于精通 JavaFX 技术至关重要。主要原因是JavaFX中的所有核心控件都是css样式的。即使是最简单的 JavaFX 应用程序通常也会使用这些控件,如果您希望能够自定义它们的外观,则需要了解 css(即使只是阅读标准的 JavaFX css 样式表,以便了解标准控件的样式)。当涉及到自定义标准控件时,通常会更容易应用 css 自定义样式表。