【问题标题】:Drag and Drop event in Javafx 2.0Javafx 2.0 中的拖放事件
【发布时间】:2012-03-07 11:27:42
【问题描述】:

我正在使用 javafx 2.0 和 netbean 7.1,在 ImageView 上拖放图像时遇到问题,我将图像保留为源(一个图像)和 2 个目标点(2 个框为目标点)。第一次尝试拖动图像时,它的工作正常,并且在将源图像输入到目标框后。再次尝试拖动图像,出现以下错误“java.lang.IllegalArgumentException:错误的字节缓冲区大小18x15 [1080] != 0"

一旦图像移动到目标对象,我需要设置监听器将其更改为源,我觉得它在这个地方抛出错误..

代码正在使用

public class DragandDropEx extends Application {

    /**
     * @param args the command line arguments
     */
    GridPane Board;
    ImageView deactivateImageView = new ImageView();
    ImageView newImageView = new ImageView();




    final Rectangle target = new Rectangle(0, 0, 50, 50);
    final Rectangle target2 = new Rectangle(0, 0, 50, 50);


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

    @Override
    public void start(Stage primaryStage) {
        target.setFill(Color.CHOCOLATE);
        target2.setFill(Color.BLUE);
        Image image = new Image(getClass().getResourceAsStream("triangle.png"));
        getDeactivateImageView().setImage(image);
        Board = new GridPane();
        primaryStage.setTitle("Drag and Drop");



        createSource(getDeactivateImageView());



        target.setOnDragOver(new EventHandler<DragEvent>() {

            @Override
            public void handle(DragEvent events) {
               events.acceptTransferModes(TransferMode.MOVE);
               events.consume();

                   createTargetDrop(target,0,8);
            }
        });
        target2.setOnDragOver(new EventHandler<DragEvent>() {

            @Override
            public void handle(DragEvent events) {
               events.acceptTransferModes(TransferMode.MOVE);
                events.consume();
                createTargetDrop(target2,0,9);
            }
        });






        Board.add(getDeactivateImageView(), 0, 1);
        Board.add(target, 0, 8);
        Board.add(target2, 0, 9);

        StackPane root = new StackPane();
        root.getChildren().add(Board);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }

    private void createSource(final ImageView imageView) {
       imageView.setOnDragDetected(new EventHandler<MouseEvent>() {
             @Override
            public void handle(MouseEvent events) {
                Dragboard storeImage =imageView.startDragAndDrop(TransferMode.MOVE);
                ClipboardContent content = new ClipboardContent();
                content.putImage(imageView.getImage());
                storeImage.setContent(content);                      **//  here i am getting error**
                events.consume();


            }
        });
    }

    private void createTargetDrop(final Rectangle target,final int xCordination,final int yCordination) {

        target.setOnDragDropped(new EventHandler<DragEvent>() {

            @Override
            public void handle(DragEvent event) {
                Dragboard db = event.getDragboard();
                Image dragedImage = db.getImage();
                getNewImageView().setImage(dragedImage);
                getDeactivateImageView().setVisible(false);
                setDeactivateImageView(getNewImageView());
                Board.add(getDeactivateImageView(),xCordination,yCordination );
                event.consume();
                createSource(getDeactivateImageView());                                         // setting listener to new image

            }
        });

    }
}

【问题讨论】:

    标签: java ria javafx javafx-2


    【解决方案1】:

    我猜它是关于参考的。我的意思是你对不同的地方使用相同的引用。也许你应该使用对象的克隆。我没有深入编写代码,但看起来您正在尝试将相同的对象添加到不同的地方。

    【讨论】:

      【解决方案2】:

      您使用哪个 JavaFX 版本?

      您可能会遇到问题,已在 2.1 中修复:http://javafx-jira.kenai.com/browse/RT-14348

      如果您使用的是 2.0.x 版本,您可以尝试 FX2.1 的开发者版本:http://www.oracle.com/technetwork/java/javafx/downloads/devpreview-1429449.html

      【讨论】:

        【解决方案3】:

        我会推荐 JavaFX,因为它包含用于创建 GUI 的场景构建器(一个 GUI)。您可以拖放 GUI 元素并在画布上调整它们的大小。然后,这将创建一个连接到 Java 控制文件的 FXML 文件。

        在此处查看场景构建器:http://www.oracle.com/technetwork/java/javase/downloads/javafxscenebuilder-info-2157684.html

        将 FXML 连接到 Java 代码有一点学习曲线,但如果您想以图形方式设计 GUI,这是值得的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-28
          • 1970-01-01
          相关资源
          最近更新 更多