Mnemonic Parsing doesn't appear to work properly

Scott Palmer swpalmer at gmail.com
Sat Oct 30 01:31:22 UTC 2021


Ah, great.
It would be nice to see progress on  JDK-8088370 <https://bugs.openjdk.java.net/browse/JDK-8088370> (it’s been 6 years since it was reported) for the mnemonic not toggling a checkbox.

Scott

> On Oct 29, 2021, at 6:20 PM, John Hendrikx <hjohn at xs4all.nl> wrote:
> 
> The fix is in progress here: https://github.com/openjdk/jfx/pull/647
> 
> On 29/10/2021 22:12, John Hendrikx wrote:
>> Looking a bit further, and I noticed this code has recently been
>> rewritten. The old code used StringBuffer and wasn't that easy to read,
>> but the new code although easier to read seems to contain several
>> changes in how things used to work.
>> 
>> The most noticable is that it doesn't stop after it finds the first
>> mnemonic (probably because it is now building a new string and stopping
>> half way would result in an incomplete string -- the old code instead
>> would delete parts from a copy so it could stop early, although that has
>> some bugs too I noticed).
>> 
>> The new code therefore finds the last mnemonic instead of the first, but
>> unfortunately, there is an off by one error that becomes gradually worse
>> as more underscores are encountered.
>> 
>> Compare the outputs (Input: How_to_test_mnemonics):
>> 
>> Old version
>> (https://github.com/openjdk/jfx/blob/jfx16/modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/behavior/TextBinding.java):
>> 
>> =========================
>> 
>> Resulting Label = Howto_test_mnemonics; mnemonicIndex = 3; mnemonic = t
>> 
>> Current version (master):
>> =========================
>> 
>> Resulting Label = Howtotestmnemonics; mnemonicIndex = 11; mnemonic = m
>> 
>> It looks like a significant change in how things used to work which the
>> tests didn't catch at all.
>> 
>> --John
>> 
>> On 29/10/2021 21:45, John Hendrikx wrote:
>>> Hm, I can confirm it appears under the "e", also under Windows, but I
>>> suspect the platform will make no difference.
>>> 
>>> I tested a bit further, and I found the following:
>>> 
>>> 1) The mnemonic key seems to be "m", and it appears under the "e"
>>> because it deleted two more underscores (index is off by 2). What makes
>>> this hard to discover however is my second finding:
>>> 
>>> 2) Checkbox doesn't toggle at all when you use the correct mnemonic, a
>>> Button however works.
>>> 
>>> 3) If you add an "onAction" to the Checkbox that prints something on the
>>> console, you can see the mnemonic working, but the Checkbox is still not
>>> toggled.
>>> 
>>> I checked the mnemonic parsing code, and if you run it in isolation, it
>>> finds the first underscore and has the correct index
>>> (TextBinding#parseAndSplit). I stopped there, but perhaps the code
>>> actually runs for each underscore found (it updates the text, perhaps
>>> this triggers another parsing run).
>>> 
>>> --John
>>> 
>>> On 29/10/2021 19:53, Scott Palmer wrote:
>>>> I looked in the bug database and while there are lots of bugs reported
>>>> against the mnemonic parsing, they claim to be fixed.
>>>> 
>>>> After noticing something peculiar on a control in my app (it was
>>>> showing a
>>>> file path and I hadn't disabled the mnemonic parsing) I did some tests.
>>>> 
>>>> The documentation is unclear on what should happen if multiple
>>>> underscores
>>>> are in the text.  It just says if the mnemonic parsing character '_'
>>>> appears that the key combination will be based on the succeeding
>>>> character.  I presume that it should pick only ONE of the underscores
>>>> and
>>>> subsequent character, either the first or the last would make sense.
>>>> However, the behavior is that an unrelated character is shown as the
>>>> mnemonic and even it doesn't actually do anything.  Tested with JDK
>>>> 17.0.1
>>>> and JavaFX 17.0.1.
>>>> 
>>>> Does this behave as expected for you?
>>>> 
>>>> 
>>>> package mnemonic_parsing_bug;
>>>> 
>>>> import javafx.application.Application;
>>>> import javafx.geometry.Insets;
>>>> import javafx.scene.Scene;
>>>> import javafx.scene.control.CheckBox;
>>>> import javafx.scene.control.Label;
>>>> import javafx.scene.layout.VBox;
>>>> import javafx.stage.Stage;
>>>> 
>>>> public class Main extends Application {
>>>> 
>>>>    public static void main(String[] args) {
>>>>        launch(args);
>>>>    }
>>>> 
>>>>    @Override
>>>>    public void start(Stage primaryStage) throws Exception {
>>>>        Label titleLabel = new Label("""
>>>>            The CheckBox below has text set to 'How_to_Test_Mnemonics'.
>>>>            On Windows press the Alt key to see where the underlined
>>>> character appears.
>>>>            It shows under the 'e' in Mnemonics for me, and I can't
>>>> figure
>>>> out
>>>>            what key combination (if any) actually does something.
>>>>            [JavaFX Version %s]""".formatted(System.getProperty(
>>>> "javafx.version")) );
>>>>        titleLabel.setMnemonicParsing(false);
>>>>        CheckBox mnemonicCB = new CheckBox("How_to_Test_Mnemonics");
>>>>        mnemonicCB.setMnemonicParsing(true);
>>>>        VBox box = new VBox(8,titleLabel, mnemonicCB);
>>>>        box.setPadding(new Insets(16));
>>>>        Scene scene = new Scene(box);
>>>>        primaryStage.setTitle("Mnemonic Parsing Bug");
>>>>        primaryStage.setScene(scene);
>>>>        primaryStage.show();
>>>>    }
>>>> 
>>>> }
>>>> 
>>> 
>> 



More information about the openjfx-dev mailing list