我在这里开了一个小游戏,我正试图用左右箭头移动图像。
图像已被声明为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
但它没有用!!
有什么建议吗?
提前致谢
答案 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,则应该有一个选项可以通过顶部的菜单栏自动格式化代码。一般来说,当人们看到格式化代码时,他们会更倾向于提供帮助。