We are very unlikely to consider such an enhancement.

This would be a somewhat different take on the idea of an Actions framework, which has been discussed several times before without a good resolution.

-- Kevin


On 1/21/2020 12:13 PM, Tom Schindl wrote:
Hi,

I see where you are coming from but IMHO JavaFX should focus on being a
Graphic and UI-Toolkit and not leak any patterns into the core API.

These are just by 2 cents so other might have another opinion.

Tom

On 21.01.20 20:59, Michael Strauß wrote:
1. Abstract:
Controls that are derived from ButtonBase generally represent an operation
that is triggered by the control.
In many cases, the control also reflects whether the operation can
currently be invoked (i.e. whether the control is enabled or disabled), or
whether the operation is currently running.
Software patterns like MVVM often encapsulate this behavior for the purpose
of decoupling business logic from UI code.


2. Implementation:
I propose adding the following interface that represents the entirety of
such an operation:

interface Command<T> {
     ReadOnlyBooleanProperty canExecuteProperty();
     ReadOnlyBooleanProperty executingProperty();
     void execute();
     void execute(T parameter);
}

An application's business logic can expose operations as implementations of
the Command interface, and define the conditions when the operation can be
executed.

Additionally, ButtonBase should be extended by adding the following two
properties:

/**
  * The button's command, which is invoked whenever the button is fired.
  * If a command is set on the button, {@link Node#disableProperty()} is
automatically
  * bound to {@link Command#canExecuteProperty()}. Any previous binding is
removed.
  */
ObjectProperty<Command<?>> commandProperty();

/**
  * The button's command parameter.
  * When the command is invoked, this parameter will be passed to the
command implementation.
  */
ObjectProperty<Object> commandParameterProperty();

These two properties are lazily instantiated to prevent allocations if an
application doesn't use commands.
In general, Commands are an opt-in feature, so existing code that makes no
use of commands is not impacted.

The command is invoked whenever the control fires an ActionEvent. This can
be achieved by overriding Node.fireEvent(Event) in ButtonBase and checking
for the presence of an ActionEvent.

I can provide a PR with an implementation of this feature.

Michael


Reply via email to