在JavaFX中,我应该使用CSS还是setter方法来更改UI节点上的属性?

有两种方法可以在我的UI节点上设置属性(标签,按钮等)

我可以使用这样的东西:

Button b = new Button("Sample"); b.setTextFill( Paint.valueOf("red") ); b.setTextAlignment( TextAlignment.CENTER ); 

或者我可以做同等的事情:

 Button b = new Button("Sample"); b.setStyle("-fx-text-alignment: center; -fx-text-fill: red"); 

我想知道的是,这些方法中的一种是出于任何原因(个人品味除外)更可取吗?

对此的回答确实归结为个人品味,但我认为有一些一般的经验法则是有用的。

JavaFX中样式的四个选项是:

  1. css样式表。
  2. 从代码发出的css setStyle命令。
  3. 用于样式的java代码。
  4. 样式的fxml属性。

我的建议是:

  1. 几乎所有样式都使用css样式表。
  2. 如果您有数千个节点,或者您个人更喜欢API提供的类型安全性和简单调试function,请使用Java API调用。
  3. 仅当您需要动态更改只能使用CSS设置且无法使用API或样式表设置的样式时, 使用setStyle。
  4. 不要通过fxml应用样式。

使用css样式表进行样式设置的优点是:

  1. 您可以将样式与代码分开。
  2. 您可以轻松定义多个样式表,并在运行时更改它们,以便为您的应用程序提供不同的外观。
  3. 您正在使用专门为样式设计的语言。
  4. 您可以在SceneBuilder等设计工具中应用样式表。

真的,如果你使用的是视觉设计工具,最后一点是至关重要的 – 你真的需要使用css样式表来充分利用它。 如果您在代码中而不是在css样式表中应用样式,那么当您尝试在可视化设计工具中设计应用程序时,您将无法真实地看到应用程序的外观。 如果你通过fxml属性应用样式,那么你的fxml变得难以处理,因为它定义了应用程序的结构和布局以及它的样式 – 通常最好将这些问题分开。

我有时会在代码中使用setStyle调用,但主要是因为懒惰而不是因为它是推荐的方法。

使用setStyle动态更改样式的需要应该是非常有限的情况。 例如,在JavaFX 2.2中,您无法通过API设置区域的背景颜色。 您可以使用styleclass设置它。 但是如果你想动态地将背景颜色设置为用户选择的颜色,那么你可以使用像这样的button.setStyle("-fx-text-fill: " + userColor.toString() + ";"); 。 所以,非常专业。

另请注意,在JavaFX 8中,只能通过css在JavaFX 2.2中完成的一些事情(例如设置区域背景)将能够通过Java API在代码中完成。 对于上面给出的为区域背景设置用户填充颜色的示例,如果使用JavaFX 8,则使用Java API将是首选方法。

在各种使用案例的性能影响方面。 在大多数情况下,我的理解(来自论坛中JavaFX css实现维护者的评论)是从大多数性能到最低性能的性能顺序如下所示:

  1. 直接API调用。
  2. 通过FXML风格。
  3. 通过styleclass应用的风格。
  4. setStyle调用。

请注意,JavaFX中的css应用程序设计非常有效,因此在许多情况下,性能不是主要考虑因素。 我的猜测是,只有当您有数千个节点被设置样式时才会对使用css产生重大性能影响,尽管我没有硬数据来支持这种猜测。

在过去,我看到JavaFX程序员的一些评论,他们不想使用css,而是更喜欢使用JavaFX API来设计他们的应用程序。 给出的原因包括更容易调试,使用单一语言编写所有内容,更好地与IDE集成以获取方法名称的帮助,编辑和编译时静态类型检查等。如果您喜欢使用Java API而不是css进行样式设置出于这些原因,在你自己的代码中,这是好的。 但是,您只能使用Java API完成所需的所有样式。

使用css以及如何在JavaFX中使用它的知识对于熟练掌握JavaFX技术至关重要。 主要原因是JavaFX中的所有核心控件都是由css设计的。 即使是最简单的JavaFX应用程序通常也会使用这些控件,如果您希望能够自定义它们的外观,那么您将需要了解css(即使它只是为了阅读标准的JavaFX css样式表,以便您知道如何标准控件的风格)。 当涉及到自定义标准控件时,通常会更容易应用css自定义样式表。

我想这可以辩论,但我认为是回去看看你希望完成什么。 如果您打算更改样式,那么在外部CSS文件中定义它时会非常干净。 然后,如果你改变你的风格(或允许用户改变他们的风格),它将在一个地方改变。

 Button b = new Button("Sample"); b.setStyleClass("myClass"); 

JavaFX适用于MVC方法。 造型肯定会落到视野中。 将所有东西放在一个地方。 为什么不把它留在那里?

还有,是什么让你的代码看起来更干净? 更容易阅读? 你或其他人在路上维修这有多容易?