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.sa...@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.goryac...@oracle.com <mailto:andy.goryac...@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-r...@openjdk.org 
>> <mailto:openjfx-dev-r...@openjdk.org>> on behalf of Thiago Milczarek Sayão 
>> <thiago.sa...@gmail.com <mailto:thiago.sa...@gmail.com>>
>> Date: Tuesday, November 21, 2023 at 02:37
>> To: openjfx-dev <openjfx-dev@openjdk.org <mailto:openjfx-dev@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.
>> 

Reply via email to