JavaFX - как использовать методы ImageView для типа объекта? - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь создать EventHandler для события перетаскивания мышью. Я использую этот же обработчик, чтобы проделать то же самое с несколькими ImageView. Вот что я сделал.

static EventHandler<MouseEvent> dragHandler = new EventHandler<MouseEvent>()    {
        @Override
        public void handle(MouseEvent e) {
            e.getSource().toFront();
            e.getSource().setTranslateX(e.getSceneX() );
            e.getSource().setTranslateY(e.getSceneY() );

        }

        };  

Но, по-видимому, я не могу использовать методы toFront или setTranslate или что-то еще, что я использовал для ImageViews, потому что e.getSource возвращает Object, а это методы ImageView, которые недоступны для типа Object. И, по-видимому, я не могу просто передать это в ImageView, выполнив

   (ImageView)( e.getSource() ).toFront();

. Я мог бы просто использовать внутренние классы и лямбда-выражения, но я подумал, что должен быть более эффективный способ, чем просто скопировать вставку тех же строк примерно 15 раз для каждого ImageView. Так что просветите меня, пожалуйста, если есть.

Заранее спасибо.

1 Ответ

2 голосов
/ 06 мая 2020

Приведение будет работать, но приоритет приведения ниже, чем при разыменовании (.), поэтому ваш пример кода пытается снизить результат (e.getSource()).toFront(), что не работает (поскольку у него нет типа, поскольку toFront() равно void).

Так что

((ImageView) e.getSource() ).toFront();

будет работать.

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

private void registerEventHandler(ImageView imageView) {
    imageView.setOnMouseDragged(e -> {
        imageView.toFront();
        imageView.setTranslateX(e.getSceneX() );
        imageView.setTranslateY(e.getSceneY() );
    });

    // register other event handlers, as needed.
}

, а затем вызвать метод для каждого просмотра изображения (в al oop, если они у вас есть в какой-либо подходящей структуре данных).

В качестве альтернативы , вы могли бы создать метод, который создает представления изображений и регистрирует любые необходимые обработчики.

Помимо того, что эти методы являются, возможно, более чистым кодом, они также избегают понижающего преобразования, что в целом хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...