Javafx 鼠标事件有效,按键事件未被捕获
Javafx mouse events working, key press events not caught
我有一个现有的应用程序,用于移动星形图案的 3d 图(平移、旋转等)
我的鼠标事件(按下、拖动等)工作正常。
我想添加一个键盘事件处理程序,但奇怪的是它从来没有捕捉到任何按键事件。
我定义了一个子场景来管理事物。这是事件设置和处理代码。在下面的代码中,所有鼠标事件都按预期工作。没有记录按键事件。
private void handleUserEvents() {
subScene.setOnKeyPressed((KeyEvent key)-> {
log.info("key={}", key);
});
subScene.setOnScroll((ScrollEvent event) -> {
double deltaY = event.getDeltaY();
zoomGraph(deltaY * 5);
updateLabels();
});
subScene.setOnMousePressed((MouseEvent me) -> {
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
mouseOldX = me.getSceneX();
mouseOldY = me.getSceneY();
}
);
subScene.setOnMouseDragged((MouseEvent me) -> {
int direction = userControls.isControlSense() ? +1 : -1;
mouseOldX = mousePosX;
mouseOldY = mousePosY;
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
mouseDeltaX = (mousePosX - mouseOldX);
mouseDeltaY = (mousePosY - mouseOldY);
// double modifier = 0.2;
double modifier = UserControls.NORMAL_SPEED;
if (me.isPrimaryButtonDown() && me.isControlDown()) {
log.info("shift sideways");
camera.setTranslateX(mousePosX);
camera.setTranslateY(mousePosY);
} else if (me.isPrimaryButtonDown()) {
if (me.isAltDown()) { //roll
rotateZ.setAngle(((rotateZ.getAngle() + direction * mouseDeltaX * modifier) % 360 + 540) % 360 - 180); // +
} else {
rotateY.setAngle(((rotateY.getAngle() + direction * mouseDeltaX * modifier) % 360 + 540) % 360 - 180); // +
rotateX.setAngle(
clamp(
(((rotateX.getAngle() - direction * mouseDeltaY * modifier) % 360 + 540) % 360 - 180),
-60,
60
)
); // -
}
}
updateLabels();
}
);
}
所以在上面的问题中。我玩弄了一些东西并找到了一个似乎有效的答案。我不太喜欢它,但它很管用...
我在下面的代码中添加了一行“subScene.requestFocus();”这会强制聚焦并使其发挥作用。
subScene.setOnMousePressed((MouseEvent me) -> {
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
mouseOldX = me.getSceneX();
mouseOldY = me.getSceneY();
subScene.requestFocus();
}
);
我有一个现有的应用程序,用于移动星形图案的 3d 图(平移、旋转等)
我的鼠标事件(按下、拖动等)工作正常。
我想添加一个键盘事件处理程序,但奇怪的是它从来没有捕捉到任何按键事件。
我定义了一个子场景来管理事物。这是事件设置和处理代码。在下面的代码中,所有鼠标事件都按预期工作。没有记录按键事件。
private void handleUserEvents() {
subScene.setOnKeyPressed((KeyEvent key)-> {
log.info("key={}", key);
});
subScene.setOnScroll((ScrollEvent event) -> {
double deltaY = event.getDeltaY();
zoomGraph(deltaY * 5);
updateLabels();
});
subScene.setOnMousePressed((MouseEvent me) -> {
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
mouseOldX = me.getSceneX();
mouseOldY = me.getSceneY();
}
);
subScene.setOnMouseDragged((MouseEvent me) -> {
int direction = userControls.isControlSense() ? +1 : -1;
mouseOldX = mousePosX;
mouseOldY = mousePosY;
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
mouseDeltaX = (mousePosX - mouseOldX);
mouseDeltaY = (mousePosY - mouseOldY);
// double modifier = 0.2;
double modifier = UserControls.NORMAL_SPEED;
if (me.isPrimaryButtonDown() && me.isControlDown()) {
log.info("shift sideways");
camera.setTranslateX(mousePosX);
camera.setTranslateY(mousePosY);
} else if (me.isPrimaryButtonDown()) {
if (me.isAltDown()) { //roll
rotateZ.setAngle(((rotateZ.getAngle() + direction * mouseDeltaX * modifier) % 360 + 540) % 360 - 180); // +
} else {
rotateY.setAngle(((rotateY.getAngle() + direction * mouseDeltaX * modifier) % 360 + 540) % 360 - 180); // +
rotateX.setAngle(
clamp(
(((rotateX.getAngle() - direction * mouseDeltaY * modifier) % 360 + 540) % 360 - 180),
-60,
60
)
); // -
}
}
updateLabels();
}
);
}
所以在上面的问题中。我玩弄了一些东西并找到了一个似乎有效的答案。我不太喜欢它,但它很管用...
我在下面的代码中添加了一行“subScene.requestFocus();”这会强制聚焦并使其发挥作用。
subScene.setOnMousePressed((MouseEvent me) -> {
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
mouseOldX = me.getSceneX();
mouseOldY = me.getSceneY();
subScene.requestFocus();
}
);