Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在拖动集上移动节点仅在父对象上激发鼠标拖动_Java_Javafx - Fatal编程技术网

Java 在拖动集上移动节点仅在父对象上激发鼠标拖动

Java 在拖动集上移动节点仅在父对象上激发鼠标拖动,java,javafx,Java,Javafx,我有一个要拖动移动的节点,当我使用setOnMouseClicked时,即使在该节点的子节点上单击该节点,也会触发该节点,但SetOnMouseClauded仅在拖动位于父节点上时才会触发: node.setOnMouseClicked(event -> { System.out.println("offset"); }); node.setOnMouseDragged(event -> { System.out.printl

我有一个要拖动移动的节点,当我使用setOnMouseClicked时,即使在该节点的子节点上单击该节点,也会触发该节点,但SetOnMouseClauded仅在拖动位于父节点上时才会触发:

    node.setOnMouseClicked(event -> {
        System.out.println("offset");

    });
    node.setOnMouseDragged(event -> {
        System.out.println("move");
    });

我想触发拖动事件,即使它是在节点的子节点上完成的。为什么mouseClicked和mouseDragged具有不同的行为?

您可以使用以下内容:

parent.setOnMouseClicked(e -> {
    if(e.isStillSincePress()){
        //executed when not from drag
    }
});
MouseeEvent::IsStillsRecepress检查按下和释放是否在同一节点中

单击鼠标按钮(在同一节点上按下并释放)时发生此事件。此事件为任何节点提供类似按钮的行为。请注意,即使长时间拖动也会生成单击事件(它被传递到最顶端的节点,在该节点上同时按下和释放鼠标)

要阻止事件到达父级,还可以使用

----------编辑----------

添加了拖动的示例代码

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class DragApplication extends Application{

    private double startX = 0, startY = 0;

    @Override
    public void start( Stage primaryStage) throws Exception{
        EventHandler< MouseEvent> clicked = e -> System.out.printf( "%s clicked%n", e.getTarget());

        EventHandler< MouseEvent> pressed = e -> {
            startX = e.getX();
            startY = e.getY();
        };

        EventHandler< MouseEvent> dragged = e -> {
            Node n = (Node) e.getTarget();
            //in case of button it returns the Text node not the button
            if(n instanceof Text)
                n = n.getParent();
            n.layoutXProperty().set( n.getLayoutX() + e.getX() - startX);
            n.layoutYProperty().set( n.getLayoutY() + e.getY() - startY);
        };

        Button paneButton = new Button( "Pane Button");
        paneButton.setOnAction( a -> System.out.println( "Pane Button Action"));
        paneButton.setOnMouseClicked( clicked);
        paneButton.setOnMousePressed( pressed);
        paneButton.setOnMouseDragged( dragged);

        Pane pane = new Pane( paneButton);
        pane.setLayoutX( 200);
        pane.setOnMouseClicked( clicked);
        pane.setOnMousePressed( pressed);
        pane.setOnMouseDragged( dragged);
        pane.setStyle( "-fx-background-color: GREEN; -fx-min-width:200; -fx-min-height:200;");

        Button achoreButton = new Button( "Anchor Button");
        achoreButton.setOnAction( a -> System.out.println( "Anchor Button Action"));
        achoreButton.setOnMouseClicked( clicked);
        achoreButton.setOnMousePressed( pressed);
        achoreButton.setOnMouseDragged( dragged);

        Button transparentAchoreButton = new Button( "Transparent Anchor Button");
        transparentAchoreButton.setMouseTransparent( true);
        transparentAchoreButton.setOnAction( a -> System.out.println( "Anchor Button Action"));
        transparentAchoreButton.setOnMouseClicked( clicked);
        transparentAchoreButton.setOnMousePressed( pressed);
        transparentAchoreButton.setOnMouseDragged( dragged);

        AnchorPane anchor = new AnchorPane(achoreButton, transparentAchoreButton);
        AnchorPane.setTopAnchor( achoreButton, 10.0);
        AnchorPane.setLeftAnchor( achoreButton, 10.0);
        AnchorPane.setBottomAnchor( transparentAchoreButton, 10.0);
        AnchorPane.setRightAnchor( transparentAchoreButton, 10.0);
        anchor.setOnMouseClicked( clicked);
        anchor.setOnMousePressed( pressed);
        anchor.setOnMouseDragged( dragged);
        anchor.setStyle( "-fx-background-color: RED; -fx-min-width:200; -fx-min-height:200;");

        Pane root = new Pane(  anchor,pane);

        primaryStage.setScene( new Scene( root, 600, 400));
        primaryStage.setTitle( "Text scaling problem");
        primaryStage.show();
    }

    public static void main( String[] args){
        launch( args);
    }
}
导入javafx.application.application;
导入javafx.event.EventHandler;
导入javafx.scene.Node;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.ancorpane;
导入javafx.scene.layout.Pane;
导入javafx.scene.text.text;
导入javafx.stage.stage;
公共类DragApplication扩展了应用程序{
专用双星tx=0,星型=0;
@凌驾
public void start(Stage primaryStage)引发异常{
EventHandlerclicked=e->System.out.printf(“%s clicked%n”,e.getTarget());
EventHandlerpressed=e->{
startX=e.getX();
startY=e.getY();
};
EventHandlerDrawed=e->{
节点n=(节点)e.getTarget();
//对于按钮,它返回文本节点,而不是按钮
如果(文本的n个实例)
n=n.getParent();
n、 layoutXProperty().set(n.getLayoutX()+e.getX()-startX);
n、 layoutYProperty().set(n.getLayoutY()+e.getY()-startY);
};
按钮窗格按钮=新按钮(“窗格按钮”);
paneButton.setOnAction(a->System.out.println(“窗格按钮操作”);
paneButton.setOnMouseClicked(单击);
paneButton.setOnMousePressed(按下);
paneButton.setOnMouseDrawed(已拖动);
窗格=新窗格(窗格按钮);
窗格。setLayoutX(200);
窗格。setOnMouseClicked(单击);
窗格。设置鼠标按下(按下);
pane.setonMouseDrawed(已拖动);
窗格.setStyle(“-fx背景色:绿色;-fx最小宽度:200;-fx最小高度:200;”);
按钮achoreButton=新按钮(“锚定按钮”);
achoreButton.setOnAction(a->System.out.println(“锚定按钮操作”);
achoreButton.setOnMouseClicked(单击);
achoreButton.setOnMousePressed(按下);
achoreButton.SetonMouseDrawed(拖动);
按钮透明TachoreButton=新按钮(“透明锚定按钮”);
transparentAchoreButton.setmousetransport(true);
transparentAchoreButton.setOnAction(a->System.out.println(“锚定按钮操作”);
transparentAchoreButton.setOnMouseClicked(单击);
透明测速按钮。设置鼠标按下(按下);
transparentAchoreButton.setonMouseDrawed(拖动);
锚定器=新锚定器(锚定器按钮、透明锚定器按钮);
AnchorPane.setTopAnchor(achoreButton,10.0);
AnchorPane.setLeftAnchor(achoreButton,10.0);
锚定.立根锚定器(透明加速按钮,10.0);
AnchorPane.setRightAnchor(透明加速按钮,10.0);
anchor.setOnMouseClicked(单击);
anchor.setOnMousePressed(按下);
anchor.SetonMouseDrawed(已拖动);
anchor.setStyle(“-fx背景色:红色;-fx最小宽度:200;-fx最小高度:200;”);
窗格根=新窗格(锚定,窗格);
原始阶段。设置场景(新场景(根,600400));
setTitle(“文本缩放问题”);
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}

我投了赞成票,但后来我尝试了,我意识到这不是我的意思。我不是说我想在点击不是来自拖动的时候触发点击,但是我想在拖动是在子对象上完成的时候执行拖动。onMouseClick和Pressed都执行,即使它们是在父节点上执行的,我猜这是最上面的节点,但拖动仅在节点本身上执行,如果我拖动子节点,则不会发生任何事情,但当我使用onMouseClick时,即使单击子节点也会触发该方法。但是如果我使用事件处理程序并使用鼠标拖动,则会起作用,即使我拖孩子的后腿。我想要与处理程序相同的行为。您是否可以显示代码?我不知道你的意思。我在窗格顶部编写了一个拖动按钮的示例,我可以毫无问题地拖动按钮和窗格。如果拖动是一个问题,请让我知道,我将发布我的示例。是的,拖动是一个问题,让我们假设父级是一个锚窗格,它有一个子级,锚定点为0,因此当我将事件附加到父级时,它会占用父级的所有宽度和高度,但它不起作用,因为子级占用父级和子级的全部宽度和高度我正在拖拽孩子们用achor添加了示例代码,请告诉我这是否有帮助。您删除了其他问题,但是如果您想查看使用
ListView
聊天的小演示,请查看@Slaw哦,谢谢,我以为讨论已经结束了。删除未回答的问题是否更好,tho?最后一个问题也转到了另一个方向。@Slaw如果您想发布示例,我还取消了删除该问题there@Slaw嘿,我试过定制工厂,但我有一个问题。当单元格因文本而高度不同时,滚动会出现问题,它会从一个地方跳到另一个地方