如何使 FXML 生成的按钮工作
How to make FXML-generated buttons work
我正在使用 JavaFX 为学校项目编写程序。我正在 SceneBuilder 8 中设计 UI,它正在为我生成 FXML。我的问题是,如何将我的按钮和滑块以及诸如此类的东西连接到我的 java 代码?是不是有点像 XCode 中的按钮编码?
如果有帮助,这是我的 FXML 源代码:
<?import javafx.scene.effect.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<SplitPane dividerPositions="0.3996655518394649" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="470.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1">
<items>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="398.0" prefWidth="145.0">
<children>
<TableView layoutY="33.0" prefHeight="323.0" prefWidth="180.0" AnchorPane.bottomAnchor="42.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="33.0">
<columns>
<TableColumn prefWidth="77.0" text="Event" />
<TableColumn prefWidth="101.0" text="Suggested time" />
</columns>
<columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
<effect>
<Blend />
</effect>
</TableView>
<Label layoutY="6.0" prefHeight="27.0" prefWidth="90.0" text="Event view">
<font>
<Font size="18.0" />
</font>
</Label>
<Button layoutY="368.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="34.0" text="+">
<font>
<Font name="System Bold" size="14.0" />
</font>
</Button>
</children></AnchorPane>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="398.0" prefWidth="267.0">
<children>
<Label layoutY="7.0" prefHeight="27.0" prefWidth="90.0" text="Detail view">
<font>
<Font size="18.0" />
</font>
</Label>
<GridPane layoutX="14.0" layoutY="34.0" prefHeight="120.0" prefWidth="258.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="124.0" minWidth="10.0" prefWidth="87.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="176.0" minWidth="10.0" prefWidth="171.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints maxHeight="30.0" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="75.0" minHeight="10.0" prefHeight="59.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="60.0" minHeight="10.0" prefHeight="31.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="25.0" minHeight="0.0" prefHeight="0.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Label text="Name" />
<Label text="Details" GridPane.rowIndex="1" />
<Label text="Estimated time" GridPane.rowIndex="2" />
<TextField promptText="Enter name" GridPane.columnIndex="1" />
<TextField promptText="Enter estimated time" GridPane.columnIndex="1" GridPane.rowIndex="2" />
<TextArea prefHeight="200.0" prefWidth="200.0" promptText="Enter details" GridPane.columnIndex="1" GridPane.rowIndex="1" />
</children>
</GridPane>
<Button layoutX="219.0" layoutY="372.0" mnemonicParsing="false" text="Done" />
<Button layoutX="152.0" layoutY="372.0" mnemonicParsing="false" text="Cancel" />
</children></AnchorPane>
</items>
</SplitPane>
感谢您的帮助!
编辑:澄清一下,我有一个 FXML 文件、一个控制器 class 和一个构造函数 class。我需要连接到我的控制器 class.
定义控制器 class 后,您可以将 FXML 文件 link 添加到它。在 SceneBuilder 中,展开左下方带标题的 "Controller" 窗格,然后输入控制器的 fully-qualified 名称 class。
要为按钮指定处理程序方法,select 按钮,然后展开 "Code" 标题窗格(右侧面板的底部窗格)。例如,您可以在 "On Action" 字段中添加操作处理程序的方法名称。
如果您在没有 SceneBuilder 的情况下执行此操作,请将属性 fx:controller="..."
添加到 FXML 的根元素,指定 fully-qualified class 名称。对于按钮,您可以将 onAction="#methodName"
添加到 <Button ... >
元素,指定按下按钮时要执行的方法的名称。该方法应该采用 ActionEvent
类型的单个参数,或者不采用任何参数。
我正在使用 JavaFX 为学校项目编写程序。我正在 SceneBuilder 8 中设计 UI,它正在为我生成 FXML。我的问题是,如何将我的按钮和滑块以及诸如此类的东西连接到我的 java 代码?是不是有点像 XCode 中的按钮编码?
如果有帮助,这是我的 FXML 源代码:
<?import javafx.scene.effect.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<SplitPane dividerPositions="0.3996655518394649" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="470.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1">
<items>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="398.0" prefWidth="145.0">
<children>
<TableView layoutY="33.0" prefHeight="323.0" prefWidth="180.0" AnchorPane.bottomAnchor="42.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="33.0">
<columns>
<TableColumn prefWidth="77.0" text="Event" />
<TableColumn prefWidth="101.0" text="Suggested time" />
</columns>
<columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
<effect>
<Blend />
</effect>
</TableView>
<Label layoutY="6.0" prefHeight="27.0" prefWidth="90.0" text="Event view">
<font>
<Font size="18.0" />
</font>
</Label>
<Button layoutY="368.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="34.0" text="+">
<font>
<Font name="System Bold" size="14.0" />
</font>
</Button>
</children></AnchorPane>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="398.0" prefWidth="267.0">
<children>
<Label layoutY="7.0" prefHeight="27.0" prefWidth="90.0" text="Detail view">
<font>
<Font size="18.0" />
</font>
</Label>
<GridPane layoutX="14.0" layoutY="34.0" prefHeight="120.0" prefWidth="258.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="124.0" minWidth="10.0" prefWidth="87.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="176.0" minWidth="10.0" prefWidth="171.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints maxHeight="30.0" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="75.0" minHeight="10.0" prefHeight="59.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="60.0" minHeight="10.0" prefHeight="31.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="25.0" minHeight="0.0" prefHeight="0.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Label text="Name" />
<Label text="Details" GridPane.rowIndex="1" />
<Label text="Estimated time" GridPane.rowIndex="2" />
<TextField promptText="Enter name" GridPane.columnIndex="1" />
<TextField promptText="Enter estimated time" GridPane.columnIndex="1" GridPane.rowIndex="2" />
<TextArea prefHeight="200.0" prefWidth="200.0" promptText="Enter details" GridPane.columnIndex="1" GridPane.rowIndex="1" />
</children>
</GridPane>
<Button layoutX="219.0" layoutY="372.0" mnemonicParsing="false" text="Done" />
<Button layoutX="152.0" layoutY="372.0" mnemonicParsing="false" text="Cancel" />
</children></AnchorPane>
</items>
</SplitPane>
感谢您的帮助!
编辑:澄清一下,我有一个 FXML 文件、一个控制器 class 和一个构造函数 class。我需要连接到我的控制器 class.
定义控制器 class 后,您可以将 FXML 文件 link 添加到它。在 SceneBuilder 中,展开左下方带标题的 "Controller" 窗格,然后输入控制器的 fully-qualified 名称 class。
要为按钮指定处理程序方法,select 按钮,然后展开 "Code" 标题窗格(右侧面板的底部窗格)。例如,您可以在 "On Action" 字段中添加操作处理程序的方法名称。
如果您在没有 SceneBuilder 的情况下执行此操作,请将属性 fx:controller="..."
添加到 FXML 的根元素,指定 fully-qualified class 名称。对于按钮,您可以将 onAction="#methodName"
添加到 <Button ... >
元素,指定按下按钮时要执行的方法的名称。该方法应该采用 ActionEvent
类型的单个参数,或者不采用任何参数。