如何在 Fxml 上添加自定义组件?

How to add a costum Component on Fxml?

我制作了一个服装按钮,但是如何在 fxml 文件中使用它? 我试图创建一个普通的 Button 并在控制器上执行类似“@FXML private CrazyButton 按钮;”导致应用程序崩溃。

让我们以 CrazyButton 为例,如何在 fxml 文件中添加一个 costumComponent?

import javafx.scene.control.Button;

public class CrazyButton extends Button {

    public CrazyButton(){
        setText("Crazy");
    }
}

这是我的 fxml 文件:

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0"
      fx:controller="sample.Controller" xmlns="http://javafx.com/javafx/8.0.112" xmlns:fx="http://javafx.com/fxml/1">
   <children>
       <!--I Wanted my costum button to be here-->
   </children>
</Pane>

所以我可以在自己的控制器上使用它:

public class Controller {

    @FXML
    private CrazyButton button;

    @FXML
    private void initialize() {

    }
}

JavaFX 库 class 在任何意义上都不是 "privileged" FXML; FXMLLoader 以相同的方式实例化所有 classes。您只需要确保您的自定义 class 在一个包中(无论如何使用 "default package" 是非常糟糕的做法),然后将其导入 FXML 并以与您完全相同的方式使用它任何其他 class。如果您的 class 在包裹 my.package 中,则看起来像

<?import javafx.scene.layout.Pane ?>
<?import my.package.CrazyButton ?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0"
      fx:controller="sample.Controller" xmlns="http://javafx.com/javafx/8.0.112" xmlns:fx="http://javafx.com/fxml/1">
   <children>
       <CrazyButton fx:id="button" />
   </children>
</Pane>