当前位置: 首页 > 知识库问答 >
问题:

JavaFX:如何在窗格上拖动imageview

宗政深
2023-03-14

有人能举一个简单的例子来说明如何设置EventHandler以在窗格(JavaFX)上拖动图像视图。对于拖动,我的意思是在图像上按下鼠标,拖动和图像应该跟随,然后释放鼠标,图像视图将停止在该位置。

共有2个答案

商和颂
2023-03-14

我想通过拖放来尝试提出的解决方案。我发现它不是最佳的。

通过拖放操作,可以触发一些不必要的机制

  • 您可以将其拖动到应用程序外部
  • 光标更改
  • 我还有一个问题,位置增量的计算似乎与速度有关

尽管如此,如果有人感兴趣,这是我的代码:

Main.java

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));

        Controller controller = new Controller();
        loader.setController(controller);

        Parent root = (Parent)loader.load();
        controller.InitUi();

        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

控制器。Java语言

package sample;

import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.input.*;
import javafx.scene.layout.AnchorPane;
import javafx.scene.shape.Rectangle;

public class Controller
{
    @FXML
    private Rectangle draggable;

    private Double lastX = null;
    private Double lastY = null;

    public void InitUi()
    {
        if (this.draggable != null)
        {
            this.draggable.setOnDragOver(new EventHandler<DragEvent>()
            {
                @Override
                public void handle(DragEvent dragEvent)
                {
                    HandleMouseMovement(dragEvent.getSceneX(), dragEvent.getSceneY());
                }
            });

            this.draggable.setOnDragDetected(new EventHandler<MouseEvent>() {
                public void handle(MouseEvent event) {
                    Dragboard db = draggable.startDragAndDrop(TransferMode.ANY);
                    ClipboardContent content = new ClipboardContent();
                    content.putString("Does not matter");
                    db.setContent(content);
                    event.consume();

                    lastX = event.getSceneX();
                    lastY = event.getSceneY();
                }
            });
        }
    }

    private synchronized void HandleMouseMovement(double sceneX, double sceneY)
    {
        double deltaX = sceneX - lastX;
        double deltaY = sceneY - lastY;

        lastX = sceneX;
        lastY = sceneY;

        double currentXAnchor =AnchorPane.getLeftAnchor(this.draggable);
        double currentYAnchor =AnchorPane.getTopAnchor(this.draggable);

        AnchorPane.setLeftAnchor( this.draggable,  currentXAnchor + deltaX*1.5);
        AnchorPane.setTopAnchor(this.draggable, currentYAnchor + deltaY*1.5);
    }
}

sample.fxml

<?import javafx.scene.layout.GridPane?>

<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.shape.Rectangle?>
<GridPane xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10" prefHeight="500" prefWidth="500">
    <AnchorPane>
        <Rectangle fx:id="draggable" width="40" height="50" AnchorPane.topAnchor="20" AnchorPane.leftAnchor="20"/>
    </AnchorPane>
</GridPane>
宰父阳焱
2023-03-14

首先阅读文档在javafx中拖放,或者您可以自己通过getMouseXgetMouseY点并更改AnchorPane中ImageView的坐标。...

 类似资料:
  • 基于此注释https://stackoverflow.com/a/29530135/1387524,我添加了一个ScrollPane,以便在画布移到可见区域之外时使用滚动。

  • 我正在JavaFx中开发一个应用程序,其中我有两个选项卡。 在第一个选项卡中,我有ComboBox: 在第二个选项卡中,我有这样的Gridpane: 我想要的是当用户从Tab A的组合框中选择3时,例如: 它应该在Tab B的Gridpane中添加3行,每列添加文本字段、复选框和datepicker。A列有文本字段,B列有复选框,C列有日期选择器,如下所示: 请帮助我如何才能实现这一点,实现后,我

  • 我有一扇没有装饰的窗户: 我想知道我怎样才能把它做成一扇可拖动的未装饰窗户?我想在用户用鼠标右键选择窗口时更改其位置,然后在按住鼠标键的同时移动鼠标。 附言:我测试了这个解决方案,但它不起作用:

  • 本文向大家介绍如何使用JavaFX创建滚动窗格?,包括了如何使用JavaFX创建滚动窗格?的使用技巧和注意事项,需要的朋友参考一下 滚动窗格包含一个UI元素,并提供它的可滚动视图。在JavaFX中,可以通过实例化javafx.scene.control.ScrollPane类来创建滚动窗格。您可以使用setContent()方法将内容设置到滚动窗格。 要将滚动窗格添加到节点- 实例化ScrollP

  • 我正在处理一个应用程序,它以透明的锚窗格开始(没有标题栏和圆角)。我想要能够拖动和移动窗口周围。我已经让它工作了,但是当我点击它时,窗口会向上弹到你从中心拖动的地方,而不是你点击的地方。 CSS: main.java: 控制器: 我有一种感觉,我需要说明光标在哪里,但我不确定如何。我是正确的还是我遗漏了一些更容易的东西?

  • 问题我如何可以嵌入这个应用程序到SPlitPane,在左边将是另一个面板。 不幸的是,代码导致了错误的坐标,