Вращение Javafx imageView при нажатии клавиши

По сути, я хочу повернуть ImageView на 90 градусов, когда пользователь нажимает R на клавиатуре.

@FXML
private Image arrow;
@FXML
private ImageView arrowDirection;


@FXML
public void arrowRotation(KeyEvent keyEvent)
{
    if(keyEvent.getCode() == KeyCode.R)
    arrowDirection.setRotate(90);
}

person Fu nam Kwan    schedule 28.03.2017    source источник


Ответы (1)


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

import java.net.URL;
import java.util.ResourceBundle;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;

public class FXMLDocumentController implements Initializable {

    @FXML
    Pane pane;

    @FXML
    ImageView imgView;

    public void arrowRotation(KeyEvent event){
        if(event.getCode().equals(KeyCode.R))
            imgView.setRotate(90);
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        Image img = new Image("https://upload.wikimedia.org/wikipedia/commons/thumb/7/7c/Javafx-layout-classes.svg/1000px-Javafx-layout-classes.svg.png");
        imgView.setImage(img);
        pane.sceneProperty().addListener(new ChangeListener<Scene>() {
            @Override
            public void changed(ObservableValue<? extends Scene> observable, Scene oldValue, Scene newValue) {
                if(newValue != null){
                    pane.requestFocus();
                }
            }
        });
        pane.setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {
                arrowRotation(event);
            }
        });

    }    

}

Конечно, для этого нужен FXML, который содержит ImageView внутри панели, но его можно легко настроить в соответствии с вашими потребностями. Функция, выполняющая вращение, работает примерно так, как вы думали, но я бы сравнивал, используя равенство, когда это возможно. Я добавил прослушиватель к sceneProperty панели, чтобы позволить панели запрашивать фокус после того, как все это загружено и сцена установлена. Это означает, что нажатие клавиши фактически вызовет обработчики KeyEventHandler, зарегистрированные на панели. Регистрация EventHandler снова проста. Надеюсь, это поможет :)

person T. Klein    schedule 28.03.2017