ESC key binding on the Scene
Martin Fox
martin at martinfox.com
Sat Nov 25 18:03:45 UTC 2023
Thiago,
I’ve tested several modal dialogs on Mac, Windows, and Linux and in all but one ESC always dismisses the dialog. The only way for a user to back out an edit is to use Undo. The exception was the standard open file dialog on the Mac. In that dialog the Search field behaves the way you propose; the first ESC cancels editing and the second dismisses the dialog.
So I agree with Andy, you could just install a filter that catches ESC and unconditionally dismiss the dialog. That’s how most modal dialogs work.
With that said I think we should implement what you propose; if there’s nothing to cancel ESC should be allowed to bubble. Just attaching a formatter to a field shouldn’t entirely disable the cancel button. In JavaFX events have to bubble all the way up to the scene to ensure the cancel and default buttons work correctly (which is an unusual design). This isn’t really an issue with the presence of the ESC binding but the way TextFieldBehavior implements cancelEdit (TextFieldBehavior:170) which consumes the event even if the text doesn’t change.
Martin
> On Nov 21, 2023, at 12:14 PM, Thiago Milczarek Sayão <thiago.sayao at gmail.com> wrote:
>
> Andy,
>
> I think you're right about the formatter.
>
> The idea was to let the key propagate if there's nothing to cancel.
>
> For example:
> If I want to cancel the edit, one ESC. The second ESC would propagate because there's nothing to cancel.
>
> Thank you for the reply.
>
>
>
> Em ter., 21 de nov. de 2023 às 14:36, Andy Goryachev <andy.goryachev at oracle.com <mailto:andy.goryachev at oracle.com>> escreveu:
>> Dear Thiago:
>>
>>
>>
>> I don’t think it’s related to undo but to a TextField with a formatter.
>>
>>
>>
>> The question is - do you want to disable the standard behavior (updating the text using the formatter on ESCAPE) completely? Or perhaps you do want to let TextField invoke cancelEdit() (see TextInputControlBehavior:178) and then close the stage?
>>
>>
>>
>> In the latter case you might consider adding an event filter on the Stage and calling hide() from there in a Platform.runLater()
>>
>>
>>
>> What do you think?
>>
>>
>>
>> -andy
>>
>>
>>
>>
>>
>> From: openjfx-dev <openjfx-dev-retn at openjdk.org <mailto:openjfx-dev-retn at openjdk.org>> on behalf of Thiago Milczarek Sayão <thiago.sayao at gmail.com <mailto:thiago.sayao at gmail.com>>
>> Date: Tuesday, November 21, 2023 at 02:37
>> To: openjfx-dev <openjfx-dev at openjdk.org <mailto:openjfx-dev at openjdk.org>>
>> Subject: ESC key binding on the Scene
>>
>> Hi,
>>
>>
>>
>> I would like to use ESC to close Stages. The problem is that if the focus is on a TextField, it consumes the event.
>>
>>
>>
>> ESC is the key binding to Undo on the TextField, but it's always consumed, even if there's nothing to undo.
>>
>>
>>
>> Is this correct? Should it not propagate if there's nothing to undo?
>>
>>
>>
>> -- Thiago.
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/openjfx-dev/attachments/20231125/64d324b7/attachment-0001.htm>
More information about the openjfx-dev
mailing list