Javafx拖动按钮从一个窗格到另一个窗格



i有一个Javafx应用程序,该应用程序包含单个Flowpane中的许多按钮。为了使按钮可拖动,我将每个按钮放入单个窗格中。用户可以从任何一个窗格中选择任何按钮并拖动&将其放在任何其他窗格上。例如,从窗格1获取按钮,然后将其拖动并将其放入窗格5中。

由于以前未知用户将选择哪个按钮,因此我认为必须先以某种方式将其添加到A Dragboard,因此可以从SetondRagdropped操作的拖放板中检索。

我能够通过以下方式拖放图像视图之间的图像。

    Dragboard db = iv_1.startDragAndDrop(TransferMode.MOVE);
    ClipboardContent content = new ClipboardContent();
    content.putImage(iv_1.getImage());

但我无法找到一种将按钮添加到拖放板的方法,因为这些选项没有特定的选项,只有似乎不适用的选项,content.puttext或content.puts.putstring()...

任何帮助将不胜感激。这就是我到目前为止的:

private void btn_1_setOnDragDetected(MouseEvent event) {
    Dragboard db = btn_1.startDragAndDrop(TransferMode.MOVE);
    ClipboardContent content = new ClipboardContent();
    // below seems to be wrong
    content.put(dataFormat,btn_1.toString());
    db.setContent(content);
    event.consume();
}

private void btn_1_setOnDragOver(DragEvent event) {
    if (event.getGestureSource() != btn_1 &&
            event.getDragboard().hasString()) {
        event.acceptTransferModes(TransferMode.MOVE);
    }
    event.consume();
}

private void pane_5_setOnDragDropped(DragEvent event) {
    Dragboard db = event.getDragboard();
    boolean success = false;
    if (db.hasString()) {
       // below must be wrong
       pane_5.setId(db.getString());
       success = true;
    }
    event.setDropCompleted(success);
    event.consume();
    }

无法在剪贴板内容(即向拖放板)添加一个按钮。您只能添加特定类型(字符串,图像)和实现序列化的对象(按钮不可能,并且它不会做您想要的)。恕我直言,拖放API在这方面非常缺陷。您应该只在拖放板上添加一些虚拟文本,并保留对当前正在拖动的按钮的引用。

快速SSCCE:

import javafx.application.Application;
import javafx.geometry.Orientation;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.SplitPane;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DataFormat;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class DragAndDropButton extends Application {
    private final DataFormat buttonFormat = new DataFormat("com.example.myapp.formats.button");
    private Button draggingButton ;
    @Override
    public void start(Stage primaryStage) {
        FlowPane pane1 = new FlowPane();
        FlowPane pane2 = new FlowPane();
        for (int i = 1 ; i <= 10; i++) {
            pane1.getChildren().add(createButton("Button "+i));
        }
        addDropHandling(pane1);
        addDropHandling(pane2);
        SplitPane splitPane = new SplitPane(pane1, pane2);
        splitPane.setOrientation(Orientation.VERTICAL);
        Scene scene = new Scene(splitPane, 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    private Button createButton(String text) {
        Button button = new Button(text);
        button.setOnDragDetected(e -> {
            Dragboard db = button.startDragAndDrop(TransferMode.MOVE);
            db.setDragView(button.snapshot(null, null));
            ClipboardContent cc = new ClipboardContent();
            cc.put(buttonFormat, "button");
            db.setContent(cc);
            draggingButton = button ;
        });
        button.setOnDragDone(e -> draggingButton = null);
        return button ;
    }
    private void addDropHandling(Pane pane) {
        pane.setOnDragOver(e -> {
            Dragboard db = e.getDragboard();
            if (db.hasContent(buttonFormat) 
                    && draggingButton != null 
                    && draggingButton.getParent() != pane) {
                e.acceptTransferModes(TransferMode.MOVE);
            }
        });
        pane.setOnDragDropped(e -> {
            Dragboard db = e.getDragboard();
            if (db.hasContent(buttonFormat)) {
                ((Pane)draggingButton.getParent()).getChildren().remove(draggingButton);
                pane.getChildren().add(draggingButton);
                e.setDropCompleted(true);
            }           
        });
    }
    public static void main(String[] args) {
        launch(args);
    }
}

最新更新