【问题标题】:making textarea draggable javafx使textarea可拖动javafx
【发布时间】:2016-03-13 18:43:08
【问题描述】:

所以我在使 textarea 可拖动时遇到问题,使用相同的事件代码我可以毫无问题地拖动文本字段,但是当我尝试使用 textarea 时,我没有得到 System.out.println("is拖");在 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);

     }

 }

【问题讨论】:

    标签: javafx lambda textarea draggable


    【解决方案1】:

    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);
        }
    }
    

    【讨论】:

    • 谢谢你,我刚刚注意到我的旧代码可以工作,但它非常笨拙,因为它只对文本区域的边框做出反应。
    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 2019-10-21
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    相关资源
    最近更新 更多