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

Xan*_*tos 8 java javafx-2

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

我可以使用这样的东西:

Button b = new Button("Sample");
b.setTextFill( Paint.valueOf("red") );
b.setTextAlignment( TextAlignment.CENTER );
Run Code Online (Sandbox Code Playgroud)

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

Button b = new Button("Sample");
b.setStyle("-fx-text-alignment: center; -fx-text-fill: red");
Run Code Online (Sandbox Code Playgroud)

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

jew*_*sea 18

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

JavaFX中样式的四个选项是:

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

我的建议是:

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

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

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

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

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

使用setStyle动态更改样式的需要应该是非常有限的情况.例如,在JavaFX 2.2中,您无法通过API设置区域的背景颜色.您可以使用styleclass设置它.但是如果你想动态地将背景颜色设置为用户选择的颜色,那么你可以使用像这样的setStyle方法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自定义样式表.

  • 您可能希望尽可能避免使用setStyle()的另一个原因是因为使用setStyle()更改的属性不能再使用直接API调用(setter)进行修改.尝试这样做只是被忽略了! (2认同)

blo*_*p3r 5

我想这可以争论,但在我看来,是回去看看你希望完成什么。如果您计划更改样式,那么在外部CSS文件中定义时会非常干净。然后,如果您以后更改样式(或允许用户更改其样式),它将在一处更改。

Button b = new Button("Sample");
b.setStyleClass("myClass");
Run Code Online (Sandbox Code Playgroud)

JavaFX配合一种方法效果很好MVC。造型肯定会成为人们关注的焦点。将所有内容放在一处。为什么不把它留在那里呢?

另外,是什么让你的代码看起来更干净?更容易阅读?您或其他人将来维护起来有多容易?