Java 在FXML中以声明方式设置样式表

Java 在FXML中以声明方式设置样式表,java,css,javafx-2,Java,Css,Javafx 2,在HTML中,我们习惯于以编程方式设置样式表,就像 <link rel="stylesheet" ... > 是否可以在FXML中设置样式表,类似于在HTML中设置样式表的方式?是,请参见的示例4-8,方法是将以下属性应用于节点: stylesheets="fxmlexample/Login.css" e、 g 您可以使用: 因为FXML中可用的元素和属性是从公共JavaFXJavaAPI派生的,所以您还可以使用FXML样式表元素(或可互换的属性)将样式表分配给父节点。当所有容

在HTML中,我们习惯于以编程方式设置样式表,就像

<link rel="stylesheet" ... >

是否可以在FXML中设置样式表,类似于在HTML中设置样式表的方式?

是,请参见的示例4-8,方法是将以下属性应用于节点:

stylesheets="fxmlexample/Login.css"
e、 g


您可以使用:

因为FXML中可用的元素和属性是从公共JavaFXJavaAPI派生的,所以您还可以使用FXML样式表元素(或可互换的属性)将样式表分配给父节点。当所有容器扩展父容器时,您可以在FXML中引用的任何容器上设置一个或多个自定义样式表:

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import java.net.URL?>
   ....
<?scenebuilder-stylesheet fruitcombo.css?>

<AnchorPane prefHeight="205.0" prefWidth="168.0"
   styleClass="layout"
   fx:controller="fruit.FruitComboController"
   xmlns:fx="http://javafx.com/fxml">
   <children>
      ....
   </children>
   <stylesheets>
      <URL value="@fruitcombo.css" />
   </stylesheets>
</AnchorPane>
有关评论的更新

警告:它是FXML 1.0,在2.0中不起作用,javafx.FXML.LoadException:URL不是有效的类型

我认为这个评论有点不正确。据我所知,目前没有FXML2.0这样的东西

评论者收到LoadException的原因是,本文中的指示性代码段没有将
java.net.URL
类导入FXML文档。我更新了代码片段以包含
java.net.URL
导入,并添加了一些省略号
,以澄清代码片段的意图。a的意思是“一系列的点,通常表示文本中有意省略的单词、句子或整个部分,而不改变其原始含义”

为了更好地理解这个答案,建议编译并运行链接的示例代码

警告不要在FXMLLoader中使用InputStream加载函数

我强烈建议构造一个带有位置的新函数,而不是使用函数。如果使用static load()函数,则无法解析相对位置引用,因为FXML文件没有基本位置

也就是说,不要做:

 InputStream input = this.getClass().getResourceAsStream("layout.fxml");
 FXMLLoader loader = new FXMLLoader.load(input);
 Parent content = loader.load();
相反,你应该:

 String url = this.getClass().getResource("layout.fxml").toExternalForm();
 FXMLLoader loader = new FXMLLoader(url);
 Parent content = loader.load();  

如果您打算将fxml与JavaFX一起使用,您应该花一些时间下载并使用SceneBuilder。一旦这样做了,css样式表的使用就变得简单了。当然,请使用NetBeans,因为在运行SceneBuilder的情况下,在NetBeans dxml样板应用程序中打开预构建的dxml文件会使其自动打开,以便在SceneBuilder中进行编辑。一旦你撕下所有的StackPlane、按钮和标签并放入你真正想要的控件和容器,只需直接将样式表添加到SceneBuilder中。在主菜单的“预览”下,有一个CSS样式表的菜单选项。选择它将打开一个子菜单,您可以在其中加载样式表文件


加载文件后,控件将根据样式表中的规则显示为蒙皮。只有在SceneBuilder的“属性”部分中选择每个控件并声明该样式表已应用于该控件后,它们才会显示该蒙皮。然后在应用程序运行时显示样式。

我喜欢它比
方法更简洁(而且更容易查找,因为它必须在开始标记中)。
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import java.net.URL?>
   ....
<?scenebuilder-stylesheet fruitcombo.css?>

<AnchorPane prefHeight="205.0" prefWidth="168.0"
   styleClass="layout"
   fx:controller="fruit.FruitComboController"
   xmlns:fx="http://javafx.com/fxml">
   <children>
      ....
   </children>
   <stylesheets>
      <URL value="@fruitcombo.css" />
   </stylesheets>
</AnchorPane>
<?scenebuilder-stylesheet fruitcombo.css?>
 InputStream input = this.getClass().getResourceAsStream("layout.fxml");
 FXMLLoader loader = new FXMLLoader.load(input);
 Parent content = loader.load();
 String url = this.getClass().getResource("layout.fxml").toExternalForm();
 FXMLLoader loader = new FXMLLoader(url);
 Parent content = loader.load();