使textarea可拖动javafx

making textarea draggable javafx

所以我在使文本区域可拖动时遇到问题,使用相同的事件代码我可以毫无问题地拖动文本字段,但是当我尝试使用文本区域时,我没有收到 System.out.println( "is dragged");在 textarea 上,但是当我单击 textarea 时,我确实得到了它被单击的反馈。

 package application;

 import javafx.application.Application;
 import javafx.scene.Scene;
 import javafx.scene.control.TextArea;
 import javafx.scene.control.TextField;
 import javafx.scene.input.MouseEvent;
 import javafx.scene.layout.AnchorPane;
 import javafx.scene.layout.BorderPane;
 import javafx.stage.Stage;

 public class TextAreaDraggableDemo extends Application {
      double orgSceneX, orgSceneY;
      double orgTranslateX, orgTranslateY;
      AnchorPane anchorpane = new AnchorPane();
     TextArea textarea = new TextArea();
     TextField textfield = new TextField();
     BorderPane root = new BorderPane();

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

@Override
public void start(Stage primaryStage) throws Exception {

    Scene scene = new Scene(root, 640, 480);
    primaryStage.setScene(scene);
    primaryStage.show();

    textarea.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> {
        orgSceneX = e.getSceneX();
        orgSceneY = e.getSceneY();
        orgTranslateX = ((TextArea) e.getSource()).getTranslateX();
        orgTranslateY = ((TextArea) e.getSource()).getTranslateY();
        System.out.println("is clicked");
        ((TextArea) (e.getSource())).toFront();
    });

    textarea.addEventHandler(MouseEvent.MOUSE_DRAGGED, e -> {
        System.out.println("is dragged");
        double offsetX = e.getSceneX() - orgSceneX;
        double offsetY = e.getSceneY() - orgSceneY;
        double newTranslateX = orgTranslateX + offsetX;
        double newTranslateY = orgTranslateY + offsetY;
        ((TextArea) (e.getSource())).setTranslateX(newTranslateX);
        ((TextArea) (e.getSource())).setTranslateY(newTranslateY);
    });

    // same code as the TextArea but this works
    textfield.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> {
        orgSceneX = e.getSceneX();
        orgSceneY = e.getSceneY();
        orgTranslateX = ((TextField) e.getSource()).getTranslateX();
        orgTranslateY = ((TextField) e.getSource()).getTranslateY();
        System.out.println("is clicked");
        ((TextField) (e.getSource())).toFront();
    });

    textfield.addEventHandler(MouseEvent.MOUSE_DRAGGED, e -> {
        System.out.println("is dragged");
        double offsetX = e.getSceneX() - orgSceneX;
        double offsetY = e.getSceneY() - orgSceneY;
        double newTranslateX = orgTranslateX + offsetX;
        double newTranslateY = orgTranslateY + offsetY;
        ((TextField) (e.getSource())).setTranslateX(newTranslateX);
        ((TextField) (e.getSource())).setTranslateY(newTranslateY);
    });

    anchorpane.getChildren().addAll(textarea, textfield);
    root.setCenter(anchorpane);

     }

 }

TextArea 有点特殊。您需要在 TextArea 的内容上添加事件处理程序,然后对 TextArea 本身而不是事件源进行操作。

这是您的代码的修改版本:

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;

public class TextAreaDraggableDemo extends Application {

    double orgSceneX, orgSceneY;
    double orgTranslateX, orgTranslateY;

    @Override
    public void start(Stage primaryStage) throws Exception {

        TextArea textarea = new TextArea();
        Group group = new Group();
        group.getChildren().addAll(textarea);

        Scene scene = new Scene(group, 640, 480);
        primaryStage.setScene(scene);
        primaryStage.show();

        Node textAreaContent = textarea.lookup(".content");
        textAreaContent.addEventHandler(MouseEvent.MOUSE_PRESSED, e -> {

            System.out.println("is clicked");

            orgSceneX = e.getSceneX();
            orgSceneY = e.getSceneY();
            orgTranslateX = textarea.getTranslateX();
            orgTranslateY = textarea.getTranslateY();

            textarea.toFront();
        });

        textAreaContent.addEventHandler(MouseEvent.MOUSE_DRAGGED, e -> {

            System.out.println("is dragged");

            double offsetX = e.getSceneX() - orgSceneX;
            double offsetY = e.getSceneY() - orgSceneY;
            double newTranslateX = orgTranslateX + offsetX;
            double newTranslateY = orgTranslateY + offsetY;

            textarea.setTranslateX(newTranslateX);
            textarea.setTranslateY(newTranslateY);
        });

    }

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