自定义组件JavaFX的自定义操作发射器属性-如何?
在开发JavaFX应用程序项目的过程中,这是我的第一个真正的难题,我甚至不知道如何正确地说出我要做的事情,因为我不知道我要使用的技术的名称 在我的应用程序中,我有多个自定义组件,因此可以构建更复杂的场景。该问题涉及3个控制部件;PrimaryControl组件拆分窗格,其中包含一个MenuComponent和一个ActivityComponent,这两个组件都是自定义的,根据在MenuComponent中设置的单选按钮的选择而更改 当来自该组件的ToggleGroup中的单选按钮发生更改时,如何使MenuControl类发出已执行的操作,然后该单选按钮将由父组件PrimaryControl中的函数处理,以便它可以更改哪个ActivityComponent可见/活动?请容忍我 primary_control.fxml自定义组件JavaFX的自定义操作发射器属性-如何?,java,javafx,fxml,Java,Javafx,Fxml,在开发JavaFX应用程序项目的过程中,这是我的第一个真正的难题,我甚至不知道如何正确地说出我要做的事情,因为我不知道我要使用的技术的名称 在我的应用程序中,我有多个自定义组件,因此可以构建更复杂的场景。该问题涉及3个控制部件;PrimaryControl组件拆分窗格,其中包含一个MenuComponent和一个ActivityComponent,这两个组件都是自定义的,根据在MenuComponent中设置的单选按钮的选择而更改 当来自该组件的ToggleGroup中的单选按钮发生更改时,如何
<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");
}
}