如果一个自定义的JavaFX组件使用FXML作为视图,我该如何正确地扩展它以添加或修改其GUI组件呢?
举个例子,假设我使用以下方法创建自定义JavaFX组件:
SpecializedButton.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(视图)
<?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>
MyApp.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();
}
}
SpecializedButton类加载FXML视图(SpecializedButton.fxml),并充当其控制器。
SpecializedButton FXML视图只创建一个HBox,左右两侧分别带有两个AnchorPanes和一个Label和Button。单击按钮时,它会调用SpecializedButton控制器类中的doSomething()方法。
问题
使用这种设置,我正在使用FXML将视图与应用程序逻辑分开。
但是,如果我想创建一个扩展SpecializedButton的新HighlySpecializedButton类,我不知道如何"扩展"视图。
如果我想要使用SpecializedButton视图,但为HighlySpecializedButton进行修改,则必须将视图代码复制到新的FXML文件中,这将导致重复的代码而不是正常的继承。
如果我不使用FXML,并在Java类中创建GUI组件,则扩展该类将使我能够正确继承并添加/修改来自父类的组件。
我显然对JavaFX的一些非常重要的概念有误解。
问题
在这种情况下,FXML视图是否过于"愚蠢",以至于每次想要从自定义组件继承时都必须创建全新的FXML视图?
或者,如果我误解了真正的问题,那么创建可扩展的自定义JavaFX组件的正确方法是什么,无论是否使用FXML?
我非常感谢任何见解。先感谢您!
<fx:include>
?或者,只需让“子类组件”的FXML
引用<SpecializedButton>
。 - James_D