在JAVAFX中用箭头移动图像

时间:2014-05-18 18:35:11

标签: javafx

我在这里开了一个小游戏,我正试图用左右箭头移动图像。

图像已被声明为ImageView,您将在附带的代码中看到..

随时随地纠正我!!

package wordsfalling;

    import java.*; 
    import java.net.URL;  
    import java.util.*;
    import java.util.ResourceBundle; 
    import javafx.event.*; 
    import javafx.event.EventHandler; 
    import javafx.fxml.*; 
    import javafx.fxml.Initializable; 
    import javafx.scene.image.ImageView;
    import javafx.scene.input.KeyCode; 
    import javafx.scene.input.KeyEvent; 
    import javafx.scene.input.*; 
    import javafx.scene.*; 

/**  * FXML Controller class  * 
      * @author ad  */

      public class WordsFallingFXMLController implements Initializable {

        @FXML
        private ImageView bar;

       // char [] alphapet = "ABCDEFGHIKLMNOPQRSTUVWXYS".toCharArray();


        public void initialize(URL url, ResourceBundle rb) {



            bar.setOnKeyPressed(new EventHandler<KeyEvent>()
        {
            @Override
            public void handle(KeyEvent ke)
            {
                if (ke.getCode().equals(KeyCode.RIGHT))
                {
                    bar.setX(4);
                }
            }
        }
            );

        } }

我也很想修改并实现它 JavaFX: Moving image with arrow keys and spacebar

但它没有用!!

有什么建议吗?

提前致谢

1 个答案:

答案 0 :(得分:3)

快速修复

如果您使用调试器进行检查,即使按键也不会执行第bar.setX(4);行。图像视图永远不会收到KeyEvent,因为它没有收到焦点。因此,如果您在设置事件处理程序后添加行image.setFocusTraversable(true);,那么您的问题将被“修复”:

public class WordsFallingFXMLController implements Initializable {   
    @FXML
    private ImageView image;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        assert image != null : "fx:id=\"image\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
        image.setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent ke) {
                if (ke.getCode().equals(KeyCode.RIGHT)) {
                    image.setX(4);
                }
            }
        });
        image.setFocusTraversable(true);
    }
}

更长的修复

但是,如果您尝试向右移动图像视图,则行bar.setX(4);并不是最好的方法,因为它只将图像4px移动到(0,0)的右侧,因此即使再次按右箭头键,图像也不会移动。此外,将模型与视图分开通常是个好主意。我的意思是你不想直接操纵图像视图。相反,您应该设置一个对象(模型),它存储图像的x和y坐标的整数值。关键事件应修改模型的x和y坐标。然后,您应该更新图像视图以反映模型的新位置。

最小重构

理想情况下,您希望将模型移动到自己的类中,但这是一个最小的示例,它通过Controller执行您所请求的内容。

public class FXMLDocumentController implements Initializable {

    @FXML
    private ImageView image; 
    int imageX = 0;
    int imageY = 0;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        image.setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent key) {
                if (key.getCode().equals(KeyCode.RIGHT)) {
                    imageX += 5;
                } else if (key.getCode().equals(KeyCode.LEFT)) {
                    imageX -= 5;
                }
                updateImageView();
            }

            private void updateImageView() {
                image.setX(imageX);
                image.setY(imageY);
            }
        });
        image.setFocusTraversable(true);
    }
}

最终评论

此外,当您在SO上发布代码时,通常最好格式化代码。如果您使用诸如Netbeans或Eclipse之类的IDE,则应该有一个选项可以通过顶部的菜单栏自动格式化代码。一般来说,当人们看到格式化代码时,他们会更倾向于提供帮助。