在JavaFX的FXML中,如何为自定义事件声明处理程序?

问题描述 投票:0回答:1

我正在使用FXML设计自定义JavaFX节点。该节点会触发一个自定义事件。而且我想知道如何在此节点的父级的FXML中向自定义事件添加事件处理程序。

我创建了处理程序,将其作为对象属性传递给子级,并通过setEventHandler方法将其挂接到事件系统中。但是当事件被触发时,它引发了一个错误。

自定义事件代码:

public class ValueUpdatedEvent extends Event {

    public static final EventType<ActionEvent> VALUE =
            new EventType<>(Event.ANY, "VALUE_UPDATED");

    private float value;

    public ValueUpdatedEvent() {
        super(VALUE);
    }

    public float getValue() {
        return value;
    }

    public void setValue(float value) {
        this.value = value;
    }
}


子组件控制器:

public class CharacteristicBar extends Component {

    @FXML
    private JFXTextField field;

    @FXML
    private JFXProgressBar bar;

    @FXML
    private JFXButton plus;

    @FXML
    JFXButton minus;

    private ObjectProperty<EventHandler<ValueUpdatedEvent>> onValueUpdated = new ObjectPropertyBase<EventHandler<ValueUpdatedEvent>>() {
        @Override
        public Object getBean() {
            return CharacteristicBar.this;
        }


        @Override protected void invalidated() {
            setEventHandler(new EventType<>(Event.ANY, "onValueUpdated"), get());
        }


        @Override
        public String getName() {
            return "onValueUpdated";
        }
    };

    private SimpleFloatProperty value = new SimpleFloatProperty();

    private boolean readonly = false;

    public CharacteristicBar() {
        super("CharacteristicBar.fxml");
        value.addListener(
                newValue -> {
                    ValueUpdatedEvent event = new ValueUpdatedEvent();
                    event.setValue(value.get());
                    fireEvent(event);
                }
        );

        bar.progressProperty().bind(this.value);
        if (this.readonly) {
            this.field.setEditable(false);
            this.minus.setVisible(false);
            this.plus.setVisible(false);
        }
    }

    @FXML
    private void handleInput(KeyEvent event) {
        try {
            value.set(Float.parseFloat(field.getText()) / 20f);
        } catch (NumberFormatException exception) {
            field.setText("");
        }
    }

    public float getValue() {
        return value.get() * 20f;
    }

    @FXML
    public void handleClickPlus(ActionEvent event) {
        this.value.set((this.value.get() * 20f + 1f) / 20f);
        this.field.setText(String.valueOf(this.value.get() * 20));
    }

    @FXML
    public void handleClickMinus(ActionEvent event) {
        this.value.set((this.value.get() * 20f - 1f) / 20f);
        this.field.setText(String.valueOf(this.value.get() * 20));
    }

    public boolean isReadonly() {
        return readonly;
    }

    public void setReadonly(boolean readonly) {
        this.readonly = readonly;
        this.field.setEditable(!readonly);
        this.minus.setVisible(!readonly);
        this.plus.setVisible(!readonly);
    }

    public EventHandler<ValueUpdatedEvent> getOnValueUpdated() {
        return onValueUpdated.get();
    }

    public ObjectProperty<EventHandler<ValueUpdatedEvent>> onValueUpdatedProperty() {
        return onValueUpdated;
    }

    public void setOnValueUpdated(EventHandler<ValueUpdatedEvent> onValueUpdated) {
        this.onValueUpdated.set(onValueUpdated);
    }
}

父母的FXML:

<CharacteristicBar fx:id="courageBar" onBarValueChanged="#handleChangeCou" 
GridPane.columnIndex="1" GridPane.rowIndex="7"/>

父级控制器中的处理程序:

    @FXML
    public void handleChangeCou(ValueUpdatedEvent event){
        System.out.println(event.getValue());
    }

仍然,没有调用我的事件处理程序。

你们是否有关于如何将我的处理程序与事件系统挂钩的线索?

提前感谢

java events javafx javafx-8 fxml
1个回答
0
投票

我无法使自定义事件生效,但是我使用属性来实现我的目标。也许打算在JavaFX中以这种方式结束]

© www.soinside.com 2019 - 2024. All rights reserved.