如何在FXML中添加CSS样式表

html-css037

如何在FXML中添加CSS样式表,第1张

每个JavaFX控件类都对应这一个CSS Type,我们可以使用类型选择器,控制该类型控件的外观。其对应的命名为:将JavaFX的类名成首字母小写,如果是由多个单词拼接的类名,将每个单词原来大写的首字母小写然后用连字符将多个单词连接。

现在创建控制器来管理按钮事件。本例演示如何把FXML和Java代码编写的事件控制器相关联。

在Projects窗口,右击 Sample.java,选择 Refactor-- Rename .

输入FXMLExampleController后点击Refactor .

打开FXMLExampleController.java删除代码,用下面的代替 Example

9 .

Example 9

FXMLExampleController.java

package fxmlexample

import javafx.event.ActionEvent

import javafx.fxml.FXML

import javafx.scene.control.Label

public class FXMLExampleController {

@FXML private Label buttonStatusText

@FXML protected void handleSubmitButtonAction(ActionEvent event) {

buttonStatusText.setText("Submit button pressed")

}

@FXML protected void handlePasswordFieldAction(ActionEvent event) {

buttonStatusText.setText("Enter key pressed")

}

}

@FXML注解用来标识非公开控制器成员和方法。

作为Java的补充,也可以使用其他编译型语言如Scala来实现控制器。.

现在可以运行了。输入内容点击Submit试试。

想要完整代码,请下载 FXMLExample.zip .

使用脚本语言

除了使用Java创建控制器,可以使用任何提供JSR223-可编译脚本引擎的语言。比如 JavaScript,

Groovy, Jython, 还有Clojure.下面是用 JavaScript编码FXML的。

在fxml_example.fxml文件中,添加JavaScript声明到XML声明后。

<?language javascript?>

在 Button标记中,改变方法名称

:

onAction="handleSubmitButtonAction(event)"

更新标记PasswordField :

onAction="handlePasswordFieldAction(event)"

移除fx:controller 从 BorderPane标记中,在

<script>中添加js方法 ,见Example

10 .

Example 10 JavaScript in FXML

<BorderPane xmlns:fx="http://javafx.com/fxml">

<fx:script>

function handleSubmitButtonAction() {

buttonStatusText.setText("Calling the JavaScript")

}

function handlePasswordFieldAction(event) {

buttonStatusText.text = "More JavaScript"

}

</fx:script>

当然也可以把js方法写进外部文件 (比如 fxml_example.js)然后像下面这样引用:

<fx:script source="fxml_example.js"/>

使用脚本编写FXML,调试时可能不会步入函数体。

使用样式表

使用内联样式,也可以添加样式表然后为结点设置关联。下面创建了样式表来定义网格布局和标签控件的样式。

创建样式表.

在Projects窗口,右击fxmlexample文件夹,选择New -- Other .

在 New File对话框中,选择Other -- Cascading Style Sheet , 然后 Next .

输入 fxmlstylesheet后点击Finish .

用下面的代码代替原来的代码 Example

11 .

Example 11 Contents of Style

Sheet

@charset "utf-8"

/*

Document : FXMLstylesheet.css

*/

.grid-pane {

-fx-padding: 80 0 0 0

}

.label {

-fx-font: normal 36px Tahoma

}

打开 FXMLExample.java,把样式表加入到下面代码前面 s tage.show() .scene.getStylesheets().add("fxmlexample/fxmlstylesheet.css")

打开 fxml_example.fxml添加样式类.

为<String>元素添加导入语句。

<?import java.lang.*?>

用下面代码代替GridPane Example

12 .

Example 12 Style Class for Grid

Pane

<GridPane alignment="top_center" hgap="8" vgap="8">

<styleClass>

<String fx:value="grid-pane"/>

</styleClass>

用下面代码代替"Sign In" Label 。 Example

13 .

Example 13 Style class for

Label

<Label text="%signIn"

GridPane.columnIndex="0" GridPane.rowIndex="0">

<styleClass>

<String fx:value="label"/>

</styleClass>

</Label>

使用<styleClass>

标签时,风格会应用到所有的类,除非它有自己的内联风格。所以Example

13 中的更改不仅应用到了 Sign

In标签,也赋予了Username 和Password标签。但不会应用到Login Example标签,因为它有自己的内联样式,覆盖了其他风格。