Search code examples
javafxtextfieldpopovercontrolsfx

TextField in PopOver with strange behavior


I have a PopOver with a TextField with a strange behavior, this PopOver it's owned by other TextField because when I type the word 'Fernández' all keys are processed by the internal TextField except when I type a stressed vowel like 'á' that it's collected by the external TextField.

PopOver owned by TextField

But when i show the same PopOver owned by a button works fine and the internal TextField receives the letter 'á'

PopOver owned by Button

I would appreciate any help to solve it.

EDIT: Here you can see an example code to show this.

public class PopOverTest extends Application {

@Override
public void start(Stage primaryStage) {

    CustomTextField externo = new CustomTextField();
    ImageView imgView = new ImageView(new Image("test/image.png"));
    externo.setLeft(imgView);

    CustomTextField interno = new CustomTextField();

    PopOver popOver = new PopOver();
    popOver.setContentNode(interno);
    popOver.stArrowLocation(PopOver.ArrowLocation.TOP_LEFT);

    imgView.setOnMouseClicked(e -> {
        popOver.show(imgView);

    });


    StackPane root = new StackPane();
    root.getChildren().add(externo);

    Scene scene = new Scene(root, 300, 250);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
   }
}

Solution

  • I found a solution for this.

    Changing the external Textfield EventDispatcher and the problem is resolved

    EventDispatcher dispatcher = externalTextField.getEventDispatcher();
    

    then on focus of the internal TextField

    externalTextField.setEventDispatcher(interntalTextField.getEventDispatcher());
    

    and when lost focus restore the EventDispatcher

    externalTextField.setEventDispatcher(dispatcher);
    

    That's all folks!