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

Javafx拖放首次不起作用

吴宝
2023-03-14

我只是做了一个简单的应用程序,包括FlowPane和一些有按钮的VBoxs。

主类是这样的。

public class Main extends Application {

    @Override
    public void start(Stage stage) {
        Gallery a = new Gallery();
        a.setMaxWidth(200);
        a.setPrefWidth(200);
        Scene scene = new Scene(a); 

        stage.setTitle("Welcome to JavaFX!"); 
        stage.setScene(scene); 
        stage.sizeToScene(); 
        stage.show(); 
    }

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

这个画廊.class是扩展FlowPane的主要后台类。

public class Gallery extends FlowPane{

    public Gallery() {
        super();

        PlotterPanel p1 = new PlotterPanel(this, "B1" );
        getChildren().add(p1);

        PlotterPanel p2 = new PlotterPanel(this, "B2");
        getChildren().add(p2);

        PlotterPanel p3 = new PlotterPanel(this, "B3" );
        getChildren().add(p3);

        PlotterPanel p4 = new PlotterPanel(this, "B4" );
        getChildren().add(p4);

        PlotterPanel p5 = new PlotterPanel(this, "B5" );
        getChildren().add(p5);

        PlotterPanel p6 = new PlotterPanel(this, "B6" );
        getChildren().add(p6);


    }
}

而PlotterPanel就是VBox,有按钮,可以在图库中拖拽。


public class PlotterPanel extends VBox{

    private static final String TAB_DRAG_KEY = "titledpane";
    private ObjectProperty<VBox> draggingTab;
    private Gallery mgallery;
    private PlotterPanel self;

    public PlotterPanel(Gallery gallery, String name) {
        super();
        mgallery = gallery;
        setPrefWidth(100);
        setPrefHeight(100);
        self = this;

        Button btn = new Button(name);
        btn.setEffect(new DropShadow());
        getChildren().add(btn);

        draggingTab = new SimpleObjectProperty<VBox>();

        setOnDragOver(new EventHandler<DragEvent>() {
            @Override
            public void handle(DragEvent event) {
                final Dragboard dragboard = event.getDragboard();
                if (dragboard.hasString()
                        && TAB_DRAG_KEY.equals(dragboard.getString())
                        && draggingTab.get() != null) {
                    event.acceptTransferModes(TransferMode.MOVE);
                    event.consume();
                }
            }
        });
        setOnDragDropped(new EventHandler<DragEvent>() {
            public void handle(final DragEvent event) {
                Dragboard db = event.getDragboard();
                boolean success = false;
                if (db.hasString()) {
                    Pane parent = mgallery;
                    Object source = event.getGestureSource();
                    int sourceIndex = parent.getChildren().indexOf(source);
                    System.out.println(sourceIndex);
                    int targetIndex = parent.getChildren().indexOf(self);
                    System.out.println(targetIndex);
                    List<Node> nodes = new ArrayList<Node>(parent.getChildren());
                    if (sourceIndex < targetIndex) {
                        Collections.rotate(
                                nodes.subList(sourceIndex, targetIndex + 1), -1);
                    } else {
                        Collections.rotate(
                                nodes.subList(targetIndex, sourceIndex + 1), 1);
                    }
                    parent.getChildren().clear();
                    parent.getChildren().addAll(nodes);
                    success = true;
                }
                event.setDropCompleted(success);
                event.consume();
            }
        });
        setOnDragDetected(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                Dragboard dragboard = self.startDragAndDrop(TransferMode.MOVE);
                ClipboardContent clipboardContent = new ClipboardContent();
                clipboardContent.putString(TAB_DRAG_KEY);
                dragboard.setContent(clipboardContent);
                draggingTab.set(self);
                event.consume();
            }
        }); 
    }

}

问题是,当我在图库中拖动绘图器面板时,它第一次就不能被拖动。我在第二次尝试后工作。当我开始拖动时,它显示了拖动框,但是当我尝试放在另一个节点上时,鼠标点显示x符号。但是当目标已经尝试拖动节点时,我可以放在该节点上。

如何让拖放在JavaFX中运行良好?

共有1个答案

拓拔欣嘉
2023-03-14

问题是以你的条件来接受这种拖累:

            if (dragboard.hasString()
                    && TAB_DRAG_KEY.equals(dragboard.getString())
                    && draggingTab.get() != null) {
                event.acceptTransferModes(TransferMode.MOVE);
                event.consume();
            }

您正在检查目标的< code>draggingTab,而不是源。如果目标本身没有被拖动,其< code>draggingTab属性仍将为null。如果你已经拖动了目标,那么它不会为空,它将接受拖动。

您的意思是让draggingTab静态吗?

 类似资料:
  • 我使用了下面的代码进行拖放。它在Firefox驱动程序中工作,但在chrome驱动程序中不起作用。 请帮忙!

  • 我有一个非常简单的测试 测试毫无例外地通过了。但是,它不执行拖放操作。我试过Chrome、Firefox和Edge。谢谢你的帮助。

  • 我已经在我的游戏中实现了拖放功能,但到目前为止,我只能“拖放”到硬编码的位置。如图所示: 我想要的是: 当船舶被丢弃时,它的x、y值(相对于GridPane)被保存,或者 飞船掉落到的细胞被保存。 我的setOnDragDropped事件在此处处理: 我觉得这应该是一个简单的鼠标悬停事件或类似的事情,但我不知道该怎么做。 编辑:下面类的完整代码: }

  • 我在网格窗格中用两个ImageView做拖放测试。我的问题是,当我完成拖放并将目标imageview移动到源imageview并释放鼠标时,我错误地以显示“img2”中的图片而不是“img1”中的图片结束。当我注释掉“setOnDragExited”方法时,我最终得到了正确的图像“img1”,任何建议都将不胜感激。

  • 我试图使用Selenium WebDriver将一个元素拖到另一个元素中,但它不起作用。我尝试了在互联网上找到的所有解决方案,但似乎没有一个对我有效。 代码1:- 代码2:- 代码3:- 代码4:- 以上代码都不适用于我。以上所有操作都会正常运行,但应用程序中不会发生拖放操作。有没有其他解决办法?谢谢

  • 我喜欢用Javafx和FXML布局编写一个九人莫里斯游戏,我将使用场景生成器进行图形部分。 谁能给我写一个关于拖放的小例子吗?因为这是一场九人莫里斯的比赛,我只喜欢拖拽,并有一些我可以扔下碎片的点。