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

在开发JavaFX应用程序项目期间,这是我的第一个真正的树桩画家,我什至不知道如何正确地说出我要做什么,因为我不知道我所使用的技术名称。我试图利用。

在我的应用程序中,我有多个自定义组件,因此可以构建更复杂的场景。该问题涉及3个控制组件。包含一个MenuComponent和一个activityComponent(均为自定义)的PrimaryControl组件(SplitPane),它们会根据在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>

menu_control.fxml

<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>

如何在MenuControl Java类中创建一个侦听器,该侦听器将能够检测到ToggleGroup选择更改,然后将该更改发送到onToggleGroupButtonSelectionChanged="#onChange",以便可以处理PrimaryControl Java类中的按钮选择?我记得在Angular中做这种事情很简单,但是由于某种原因,我找不到关于Java的任何信息。这就是所谓的依赖注入吗?

我找到了此链接,并尝试实现我的问题,但未成功,因为没有任何解释,并且正在监听JavaFX 2.0 - create action handler for custom component in FXML的另一个事件。

PrimaryController.java(与MenuControl.java相同)

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");
    }
}

在此先感谢您帮助我的人。

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

  • 首先,创建一个表示可能的选择的枚举:
public enum SelectionMode {
    ONE,TWO,THREE
}
  • 现在,向菜单控件添加一个属性,该属性使其他控件能够知道所选择的内容,而无需暴露其背后的逻辑或使其与其他控件可更改(使用ReadOnlyObjectProperty):
private ReadOnlyObjectWrapper<SelectionMode> selectionMode
    = new ReadOnlyObjectWrapper<>(this,"selectionMode");

public final ReadOnlyObjectProperty<SelectionMode> selectionModeProperty() {
    return selectionMode.getReadOnlyProperty();
}

private final SelectionMode getSelectionMode() {
    return selectionMode.get();
}
  • 将此属性绑定到Menu Controller类的initialize方法中的选定单选按钮。请注意,我正在使用setUserDatagetUserData方法,否则,您需要为每个具有的单选按钮创建一个if子句:
@Override
public void initialize(URL location,ResourceBundle resources) {
    one.setUserData(SelectionMode.ONE);
    two.setUserData(SelectionMode.TWO);
    three.setUserData(SelectionMode.THREE);

    selectionMode.bind(Bindings.createObjectBinding(() -> {
        Toggle selectedToggle = menuSelection.getSelectedToggle();
        return (SelectionMode) selectedToggle.getUserData();
    },menuSelection.selectedToggleProperty()));
}
  • 您的主控制器类可以通过在<MenuControl fx:id="menu"/>中设置ID来访问其菜单控制器。 然后,您只需分配一个ChangeListener并在每次更改选择时得到通知:
menu.selectionModeProperty().addListener((observable,oldValue,newValue) -> {
    // write your code here
});

注意:您可以像这样在fxml中初始化用户数据(而不是在initialize方法中进行初始化):

<RadioButton fx:id="one" text="one" toggleGroup="$menuSelection">
    <userData>
        <SelectionMode fx:constant="ONE"/>
    </userData>
</RadioButton>
<RadioButton fx:id="two" text="two" toggleGroup="$menuSelection">
    <userData>
        <SelectionMode fx:constant="TWO"/>
    </userData>
</RadioButton>
<RadioButton fx:id="three" text="three" toggleGroup="$menuSelection">
    <userData>
        <SelectionMode fx:constant="THREE"/>
    </userData>
</RadioButton>
本文链接:https://www.f2er.com/2756589.html

大家都在问