我刚刚制作了一个简单的应用程序,其中包括 FlowPane 和一些带有按钮的 VBox。Main类是这样的。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); }}这个 Gallery.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,有Button并且可以在Gallery中拖放。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>();问题是,当我在图库中拖动 PlotterPanel 时,第一次无法拖动它。我在第二次尝试后工作了。当我开始拖动时,它显示拖动框,但是当我尝试放在另一个节点上时,鼠标点显示 x 符号。但是当目标已经尝试节点被拖动时,我可以放在该节点上。我怎样才能使拖放在 JavaFX 中正常工作?
1 回答
德玛西亚99
TA贡献1770条经验 获得超3个赞
问题在于你接受阻力的条件:
if (dragboard.hasString()
&& TAB_DRAG_KEY.equals(dragboard.getString())
&& draggingTab.get() != null) {
event.acceptTransferModes(TransferMode.MOVE);
event.consume();
}
您正在检查draggingTab目标,而不是源。如果目标本身没有被拖动,它的draggingTab属性仍然为空。如果您已经拖动了目标,那么它不会为空并且它将接受拖动。
你是说做draggingTab静态的吗?
添加回答
举报
0/150
提交
取消