Проблема с тильдами в textfield внутри popover

Я использую PopOver, который содержит TextField и появляется, когда пользователь кликает в imageView CustomTextField. Когда я плох внутри внутреннего TextField, все в порядке до тех пор, пока я не ввожу ударную гласную, которая для моего сюрприза подбирает ее внешний TextField вместо ученика закрытого учебного заведения.

Я показываю образы того, за чем Вы последуете, когда popover.show(imageView)

Когда popover появляется с пуговицы, нет никакой проблемы popover.show(button)

Не, Вы, кажется, рассматриваетесь о bug. Если у кого-то есть какая-то идея о, почему Вы последуете за этим, Вы были бы благодарны за любую помощь. Спасибо

EDIT: Здесь я воспроизвожу пример кодекса, в котором случается эффект, который я комментирую, когда ты вводишь гласную с тильдой в textfield ученик закрытого учебного заведения, он не появляется в ученике закрытого учебного заведения, но да в приходящем ученике.

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

        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);
    }

}

3
задан 23.10.2016, 00:44
1 ответ

Я нашел решение этой проблемы.

Состой в менянии внешнего Кейевентдиспатер дель Текстфьельд на ученика закрытого учебного заведения и функционируй в верно.

externo.setEventDispatcher(interno.getEventDispatcher());

заблаговременно мы это сохраняем, чтобы мочь возвращать это после:

EventDispatcher dispatcher = externo.getEventDispatcher();

Чтобы расширять пример для случая, в котором есть более одного внутреннего TextField, нужно менять EventDispatcher на EventDispatcher каждого TextField, когда он получает фокус, и возвращать это, когда он это теряет.

Я показываю полный пример с двумя внутренними TextFields:

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 interno1 = new CustomTextField();
        CustomTextField interno2 = new CustomTextField();
        VBox box = new VBox(5, interno1, interno2);

        PopOver popOver = new PopOver();
        popOver.setContentNode(box);
        popOver.setArrowLocation(PopOver.ArrowLocation.TOP_LEFT);

        EventDispatcher dispatcher = externo.getEventDispatcher();

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


        interno1.focusedProperty().addListener((observable,  oldValue,  newValue) -> {
            if (newValue) {
                externo.setEventDispatcher(interno1.getEventDispatcher());
            } else {
                externo.setEventDispatcher(dispatcher);
            }
        });

        interno2.focusedProperty().addListener((observable,  oldValue,  newValue) -> {
            if (newValue) {
                externo.setEventDispatcher(interno2.getEventDispatcher());
            } else {
                externo.setEventDispatcher(dispatcher);
            }
        });


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

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

        primaryStage.setTitle("PopOver Test");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
}
0
ответ дан 24.11.2019, 12:58