如何扩展使用 FXML 的自定义 JavaFX 组件
如果自定义 JavaFX 组件对视图使用 FXML,如何正确扩展它来添加或修改其 GUI 组件?
作为示例场景,假设我使用以下方法来创建自定义 JavaFX 组件:
专用按钮.java(控制器)
package test;
import java.io.IOException;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
public class SpecializedButton extends HBox
{
@FXML private Button button;
@FXML private Label label;
public SpecializedButton()
{
FXMLLoader loader = new FXMLLoader( getClass().getResource( "SpecializedButton.fxml" ) );
loader.setRoot( this );
loader.setController( this );
try {
loader.load();
} catch ( IOException e ) {
throw new RuntimeException( e );
}
}
// specialized methods for this specialized button
// ...
public void doSomething() {
button.setText( "Did something!" );
}
}
SpecializedButton.fxml (View)
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.control.Button?>
<fx:root type="HBox" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<children>
<AnchorPane HBox.hgrow="ALWAYS">
<children>
<Label fx:id="label" text="Click to do something: " AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</AnchorPane>
<AnchorPane HBox.hgrow="ALWAYS">
<children>
<Button fx:id="button" onAction="#doSomething" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</AnchorPane>
</children>
</fx:root>
我的应用.java
package test;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class MyApp extends Application
{
public static void main( String[] args )
{
launch( args );
}
public void start( Stage stage ) throws Exception
{
stage.setScene( new Scene( new SpecializedButton(), 300, 50 ) );
stage.show();
}
}
类加载 FXML 视图 (SpecializedButton.fxml) 并充当其控制器。
SpecializedButton FXML 视图只是创建一个 HBox,其中两个锚窗格以及一个标签和按钮分别位于左侧和右侧。单击该按钮时,它将调用 SpecializedButton 控制器类中的 doSomething()。
问题
通过此设置,我将使用 FXML 将视图与应用程序逻辑分开。
但是,如果我想创建一个新的高度专业化按钮类来扩展SpecializedButton,我不知道如何“扩展”视图。
如果我想使用SpecializedButton视图,但为HighpecializedButton修改它,我必须将视图代码复制到一个新的FXML文件中,从而导致重复的代码而不是正确的继承。
如果我没有使用FXML,而是在Java类中创建GUI组件,那么扩展该类将使我能够正确地从超类继承和添加/修改组件。
我显然误解了JavaFX的一些非常重要的概念。
问题
在这种情况下,FXML 视图是否如此“愚蠢”,以至于每次我想从自定义组件继承时都必须创建一个全新的 FXML 视图?
或者,如果我误解了真正的问题,那么创建可扩展的自定义JavaFX组件的正确方法是什么,无论是否使用FXML?
我非常感谢任何见解。提前致谢!