Add command support for actionable controls

Kevin Rushforth kevin.rushforth at oracle.com
Tue Jan 21 20:39:18 UTC 2020


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



More information about the openjfx-dev mailing list