- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个游戏,用户需要将 ImageView 拖到 GridPane 上,当他们拖动它时,我希望他们能够按一个键来旋转 ImageView。我只希望它们能够在拖动时旋转 ImageView,因此我在拖动事件开始时设置 KeyEvent 处理程序,然后将其删除。
这是设置处理程序的代码:
private void setPlacementHandlers()
{
setOnMouseMoved(event -> trackMouse(event));
setOnDragDetected(event -> pickedUp(event));
setOnDragDone(event -> placed(event));
}
这是 OnDragDetected 的代码:
private void pickedUp(MouseEvent event)
{
//Get variables from Ship
ShipPart[] parts = ship.getParts();
int shipSize = ship.getSize();
Dragboard db = this.startDragAndDrop(TransferMode.MOVE);
ship.getBoard().setDraggedPart(this);
ClipboardContent cbContent = new ClipboardContent();
cbContent.putImage(this.getImage());
db.setDragView(shipImage);
db.setDragViewOffsetX((partIndex * 50) + mouseX);
db.setDragViewOffsetY(mouseY);
db.setContent(cbContent);
setFocusTraversable(true);
requestFocus();
setOnKeyPressed(keyEvent -> rotate(keyEvent, db, cbContent));
getScene().onKeyPressedProperty().bind(this.onKeyPressedProperty());
for(int i = 0; i < shipSize; i++)
parts[i].setVisible(false);
event.consume();
}
这是我用于测试目的的 OnKeyPressed 临时版本:
private void rotate(KeyEvent keyEvent, Dragboard db, ClipboardContent cbContent)
{
System.out.println("Potato");
}
我尝试过 setFocusTraversable(true);和 requestFocus();
出于调试目的,我删除了在拖动完成后删除 KeyEvent 处理程序的代码,结果发现 KeyEvent 在 DragEvent 之后工作正常,但在 DragEvent 期间工作正常。
总而言之,问题不在于 ImageView 没有获取 KeyEvent,而似乎 KeyEvent 甚至没有由于 DragEvent 而生成。
感谢任何帮助。
更新:我还尝试将 KeyEvent 处理程序添加到另一个对象,然后将更改应用到我想要更改的对象,但是这不起作用。我还尝试了线程和任务的各种组合。
最佳答案
拖放操作是 native 系统操作。它显示的任何图形都是 native 对象,而不是 Java 应用程序的一部分,尽管系统为应用程序提供了有限的配置它的能力,Java 通过 Dragboard 等类提供了访问权限。
由于拖动的对象不是 JavaFX 节点,因此无法监听其上的(大多数)按键事件。事实上,当拖动发生时,程序中很可能没有节点具有键盘焦点。
如果拖动源和拖动目标都在同一个场景中,您可以自己模拟拖动,方法是将场景的内容放在 StackPane 中,然后在同一个 StackPane 中放置一个“拖动 Pane ”,使其处于打开状态内容顶部,带有一个剪辑,确保它不会阻止内容的键盘或鼠标事件。拖动 Pane 包含可拖动节点的副本(在您的情况下为 ImageView)和用于突出显示当前拖动下的任何节点的形状。
import java.nio.file.Paths;
import java.util.List;
import javafx.application.Application;
import javafx.beans.Observable;
import javafx.geometry.Bounds;
import javafx.geometry.Insets;
import javafx.geometry.Point2D;
import javafx.geometry.Pos;
import javafx.stage.Stage;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.SplitPane;
import javafx.scene.image.ImageView;
import javafx.scene.shape.Polyline;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Shape;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
public class ImageDragExample
extends Application {
private static final String DEFAULT_IMAGE =
"http://solarsystem.nasa.gov/images/galleries/618486main_earth_320.jpg";
private GridPane grid;
private ImageView preview;
private ImageView dragImage;
private Pane dragPane;
private Rectangle dragPaneClip;
private Point2D dragStart;
private Node dragTarget;
private Shape dragHighlight;
@Override
public void start(Stage stage) {
grid = new GridPane();
grid.setHgap(24);
grid.setVgap(24);
grid.setPadding(new Insets(12));
int id = 0;
for (int row = 0; row < 3; row++) {
Node p1 = createPlaceholder(String.valueOf(row * 4 + 1));
Node p2 = createPlaceholder(String.valueOf(row * 4 + 2));
Node p3 = createPlaceholder(String.valueOf(row * 4 + 3));
Node p4 = createPlaceholder(String.valueOf(row * 4 + 4));
grid.addRow(row, p1, p2, p3, p4);
}
List<String> args = getParameters().getRaw();
preview = new ImageView(args.isEmpty() ? DEFAULT_IMAGE :
Paths.get(args.get(0)).toUri().toString());
BorderPane imageArea = new BorderPane(preview);
imageArea.setPadding(new Insets(12));
Region contents = new BorderPane(new SplitPane(grid, imageArea));
dragImage = new ImageView();
dragImage.imageProperty().bind(preview.imageProperty());
dragImage.setFocusTraversable(true);
dragImage.setOpacity(0);
dragImage.setOnMousePressed(e -> startDrag(e));
dragImage.setOnMouseDragged(e -> updateDrag(e));
dragImage.setOnMouseReleased(e -> endDrag(e));
dragImage.setOnKeyPressed(e -> rotate(e));
dragPane = new AnchorPane(dragImage);
dragPaneClip = new Rectangle();
dragPane.setClip(dragPaneClip);
StackPane pane = new StackPane(contents, dragPane);
Scene scene = new Scene(pane);
stage.setScene(scene);
preview.boundsInParentProperty().addListener(this::placeDragImage);
imageArea.boundsInParentProperty().addListener(this::placeDragImage);
stage.widthProperty().addListener(this::placeDragImage);
stage.heightProperty().addListener(this::placeDragImage);
placeDragImage(null);
stage.setTitle("Image Drag Example");
stage.show();
}
private void rotate(KeyEvent e){
System.out.println(e.getCode() + " pressed");
}
private void startDrag(MouseEvent event){
dragStart = new Point2D(event.getScreenX(), event.getScreenY());
dragImage.setOpacity(0.5);
dragImage.requestFocus();
dragPane.setClip(null);
}
private void updateDrag(MouseEvent event){
double x = event.getScreenX();
double y = event.getScreenY();
double xDelta = x - dragStart.getX();
double yDelta = y - dragStart.getY();
dragImage.setTranslateX(xDelta);
dragImage.setTranslateY(yDelta);
Node newDragTarget = null;
for (Node node : grid.getChildren()) {
if (node.contains(node.screenToLocal(x, y))) {
newDragTarget = node;
break;
}
}
removeDragHighlight();
dragTarget = newDragTarget;
addDragHighlight(dragTarget);
}
private void endDrag(MouseEvent event){
if (dragTarget != null) {
removeDragHighlight();
System.out.println("Dropped on " + dragTarget.getId());
}
dragImage.setOpacity(0);
dragImage.setTranslateX(0);
dragImage.setTranslateY(0);
dragPane.setClip(dragPaneClip);
dragStart = null;
dragTarget = null;
}
private void placeDragImage(Observable o) {
if (preview.getScene() != null && dragImage.getScene() != null) {
Point2D point = preview.localToScene(0, 0);
if (point != null) {
point = dragImage.getParent().sceneToLocal(point);
AnchorPane.setLeftAnchor(dragImage, point.getX());
AnchorPane.setTopAnchor(dragImage, point.getY());
dragPaneClip.setX(point.getX());
dragPaneClip.setY(point.getY());
dragPaneClip.setWidth(dragImage.getLayoutBounds().getWidth());
dragPaneClip.setHeight(dragImage.getLayoutBounds().getHeight());
}
}
}
private void addDragHighlight(Node node) {
if (node != null) {
Bounds bounds = node.getBoundsInLocal();
dragHighlight = null;
if (node instanceof Region) {
dragHighlight = ((Region) node).getShape();
}
if (dragHighlight == null) {
dragHighlight = new Rectangle(
bounds.getMinX(), bounds.getMinY(),
bounds.getWidth(), bounds.getHeight());
} else {
// Clone the node's shape by subtracting an empty shape from it.
dragHighlight = Shape.subtract(dragHighlight, new Polyline());
}
dragHighlight.setStrokeWidth(2);
dragHighlight.setStroke(Color.RED);
dragHighlight.setFill(null);
bounds = dragHighlight.getBoundsInLocal();
Point2D shapeOrigin =
node.localToScene(bounds.getMinX(), bounds.getMinY());
shapeOrigin = dragPane.sceneToLocal(shapeOrigin);
dragPane.getChildren().add(dragHighlight);
AnchorPane.setLeftAnchor(dragHighlight, shapeOrigin.getX());
AnchorPane.setTopAnchor(dragHighlight, shapeOrigin.getY());
}
}
private void removeDragHighlight() {
if (dragHighlight != null) {
dragPane.getChildren().remove(dragHighlight);
dragHighlight = null;
}
}
private Node createPlaceholder(String id) {
Label label = new Label(id);
label.setId(id);
label.setAlignment(Pos.CENTER);
label.setStyle("-fx-background-color: #c0c0ff;");
label.setPrefSize(200, 200);
return label;
}
}
关于java - 在 JavaFX 中同时处理 KeyEvent 和 MouseEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42832007/
对于我的生活,我在互联网上找不到任何帮助。我的目标是编写一个在按住 shift 键并在应用程序上单击鼠标时发生的函数。现在我只关注转变。 我有这门课: public void keyPressed(K
KeyEvent.SHIFT_DOWN_MASK 和 KeyEvent.SHIFT_MASK 有什么区别?Javadoc 说“建议改用 SHIFT_DOWN_MASK”。 最佳答案 如果您查看 val
根据 API 29 中的文档,KeyEvent.getCharacters()已弃用,但我找不到相同的替代方法。 根据文档,它说 "@deprecated no longer used by the
我正在处理一个特定的场景,使用 selenium 上传文档。多次失败后我想自己调试一下代码。这是我的代码和错误。 public void uploadFile(String imagePath) {
在 Firefox 3.6 和 4.0 中,我可以将 KeyboardEvent 的 keyCode 与存储在全局 KeyEvent 中的键的预定义常量进行比较对象(它是 DOM3 规范的一部分)。
我是 Wicket 的新手,我想创建一个 ajax 行为,如果按下功能键,它会调用我的 Javacode。 我的想法是创建一种向浏览器发送一些 Javascript 的行为,只有 F-Key 会导致
我的 java 类文件看起来像 public class SignIn extends Activity { /*** Called when the activity is first create
我注意到 Java KeyEvent 对象有一个 getExtendedKeyCode() 方法和一个 getKeyCode() 方法,它们都返回整数。有什么区别? 最佳答案 Java 的 docum
我想要一个程序,它将使用 KeyEvent 读取一个文件中按下的键,并将其写入下一个文件中的控制台。我设置了 Q 和 W 键,但每当我尝试运行该程序时,它都会发送垃圾邮件“按下 Q 键”和“按下 W
如果我使用 GUI 并且有一个文本字段,用户可以在其中输入内容,然后程序会输入回来,那么我将如何在方法期间访问 KeyEvent? (keyEvent 是当按下 Enter 键时 -> 文本字段中的文
我有一个面板,上面有 Jtextfield只接受数字。因此,当我按 Enter 时将加载用户配置文件。这只是为了查看他的个人资料。 我想要的:当我再次按 ENTER 键时,所有配置文件都将被清除,当我
我想知道如何在按键事件中按下所有按键。例如,我想为 ctrl + f 编写一个监听器来切换全屏。如何检查在一个事件中是否同时按下了 ctrl 和 f ? 编辑1: 我尝试打印 KeyEvent.get
我将在java中创建简单的打字游戏。所以我创建了新的类wordpanel,它扩展了jpanel。除了按键事件之外,一切都正常。当我按下一个键时,所有第一个jlable面板的前景应该更改为黄色.但我认识
我正在用 Java 编写一个语法突出显示文本编辑器,但我遇到了一些问题,我应该做什么,而不是我想要做什么。基本上 KeyEvent 类给我带来了一些问题: KeyTyped 不允许我识别关键是什么所以
我正在制作一种乒乓球游戏,但我有一个问题。我的代码中有一个方法,用于检查用户输入是否按下了某个键。但当我按下(在我的例子中)UP键时它不会执行。 这是代码,抱歉英语不好,请帮助我: import ja
这是一个探索性问题,用于确定我是否应该花时间进行实现,如果它是一条“成本效益”的途径。我承认我还没有尝试自己实现这个。与代码块相比,我更希望获得理解和指导。 我知道可以通过向接收焦点的对象添加 Key
如果我的鸡到达角落,我会尝试限制移动这里是我移动方法的代码 public void move1(){ if(((x=350)) || ((x>=450) && (y>=350))){
我正在尝试使用 JavaFX 创建一个 GUI 环境(仍处于非常早期的阶段),我已经实现了 EventHandler,MouseEvent 工作正常,但 KeyEvent 似乎由于某些原因无法工作。我
我正在开发一个应用程序并卡住了。我有一个普通的简单按钮。我想要做的是,如果我单击此按钮,它的行为就像您在软键盘上按空格键一样。 我该怎么做。一定有办法,因为您可以开发软键盘。 所以重复 xP 如果我按
我需要通过单击链接来模拟按键。必须通过单击链接或类似功能调用键盘快捷键 CTRL++。 最佳答案 您不能使用 JavaScript 调用按键操作。 但是,您可以使用 JavaScript 控制缩放级别
我是一名优秀的程序员,十分优秀!