Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义组件JavaFX的自定义操作发射器属性-如何?_Java_Javafx_Fxml - Fatal编程技术网

自定义组件JavaFX的自定义操作发射器属性-如何?

自定义组件JavaFX的自定义操作发射器属性-如何?,java,javafx,fxml,Java,Javafx,Fxml,在开发JavaFX应用程序项目的过程中,这是我的第一个真正的难题,我甚至不知道如何正确地说出我要做的事情,因为我不知道我要使用的技术的名称 在我的应用程序中,我有多个自定义组件,因此可以构建更复杂的场景。该问题涉及3个控制部件;PrimaryControl组件拆分窗格,其中包含一个MenuComponent和一个ActivityComponent,这两个组件都是自定义的,根据在MenuComponent中设置的单选按钮的选择而更改 当来自该组件的ToggleGroup中的单选按钮发生更改时,如何

在开发JavaFX应用程序项目的过程中,这是我的第一个真正的难题,我甚至不知道如何正确地说出我要做的事情,因为我不知道我要使用的技术的名称

在我的应用程序中,我有多个自定义组件,因此可以构建更复杂的场景。该问题涉及3个控制部件;PrimaryControl组件拆分窗格,其中包含一个MenuComponent和一个ActivityComponent,这两个组件都是自定义的,根据在MenuComponent中设置的单选按钮的选择而更改

当来自该组件的ToggleGroup中的单选按钮发生更改时,如何使MenuControl类发出已执行的操作,然后该单选按钮将由父组件PrimaryControl中的函数处理,以便它可以更改哪个ActivityComponent可见/活动?请容忍我

primary_control.fxml

<fx:root type="javafx.scene.layout.VBox" xmlns:fx="http://javafx.com/fxml">
    <MenuControl onToggleGroupButtonSelectionChanged="#onChange"/>
    <ActivityOneControl fx:id="one" isVisible="true"/>
    <ActivityTwoControl fx:id="two" isVisible="false"/>
    ...
</fx:root>
<fx:root type="javafx.scene.layout.VBox" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/10.0.2-internal">

    <GridPane alignment="CENTER" hgap="10" vgap="10">
        <padding><Insets bottom="25" left="25" right="25" top="15" /></padding>
        <Label text="Select A Task" GridPane.columnIndex="0" GridPane.rowIndex="0">
            <font><Font name="System Bold" size="13.0" /></font>
        </Label>

        <fx:define>
            <ToggleGroup fx:id="menuSelection"/>
        </fx:define>

        <RadioButton fx:id="one" text="one" GridPane.columnIndex="0" GridPane.rowIndex="1" toggleGroup="$menuSelection">
        </RadioButton>
        <RadioButton fx:id="two" text="two" GridPane.columnIndex="0" GridPane.rowIndex="2" toggleGroup="$menuSelection">
        </RadioButton>
        <RadioButton fx:id="three" text="three" GridPane.columnIndex="0" GridPane.rowIndex="3" toggleGroup="$menuSelection">

        </RadioButton>
    </GridPane>

</fx:root>
提前感谢所有帮助我的人

首先,创建表示可能选择的枚举: 公共枚举选择模式{ 一,二,三 } 现在,向菜单控件添加一个属性,该属性使其他控件能够知道所选内容,而无需公开其背后的逻辑,也无需使用ReadOnlyObjectProperty使其可从其他控件更改: 私有只读对象包装器选择模式 =新建只读对象包装器此,选择模式; 公共最终只读对象属性selectionModeProperty{ 返回selectionMode.getReadOnlyProperty; } 私有最终选择模式getSelectionMode{ 返回selectionMode.get; } 将此属性绑定到菜单控制器类的initialize方法中选定的单选按钮。请注意,我使用的是setUserData和getUserData方法,否则,您需要为每个单选按钮提供一个if子句: @凌驾 public void初始值设定项URL位置,ResourceBundle资源{ one.setUserDataSelectionMode.one; 2.setUserDataSelectionMode.2; 3.setUserDataSelectionMode.3; selectionMode.Bindings.createObjectBinding->{ 切换selectedToggle=menuSelection.getSelectedToggle; 返回SelectionModeSelectedToggle.getUserData; },menuSelection.selectedToggleProperty; } 主控制器类可以通过在中设置id来访问其菜单控制器。 然后,您可以只分配一个ChangeListener,并在每次更改选择时收到通知: menu.selectionModeProperty.addListenerobservable、oldValue、newValue->{ //在这里编写代码 }; 注意:您可以像这样在fxml中初始化用户数据,而不是在initialize方法中:


谢谢,我理解逻辑,但是代码有点混乱。initialize方法重写的是哪个类?我从@Override中得到一个错误,因为没有方法来重写它,也没有调用它。ChangeListener是否在fxmlLoader.load之后或之前进入构造函数?我把枚举放在我的menuController中,我得到的是NoSuchFieldException,这是合适的位置吗?
public class PrimaryControl extends VBox {

    public DashboardControl() {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("primary_control.fxml"));
        fxmlLoader.setRoot(this);
        fxmlLoader.setController(this);

        try {
            fxmlLoader.load();
        } catch (IOException exception) {
            throw new RuntimeException(exception);
        }
    }

    @FXML
    protected void onChange() {
        System.out.println("change activity");
    }
}