【问题标题】:JavaFX MediaPlayer "Error: 80de0001 in CallbackToJava..."JavaFX MediaPlayer“错误:CallbackToJava 中的 80de0001...”
【发布时间】:2014-11-18 20:36:46
【问题描述】:

我正在制作一个媒体播放器,它允许用户将媒体缩略图拖放到媒体播放器上(使用 JavaFX MediaPlayer)。

当我运行它并尝试拖放功能时,有时它工作正常,正如预期的。但是有时它会产生 weird 错误。

其完整性的错误是:

Error:80de0001 in CallbackToJava(javaIDs.View.notifyDragDrop, grfKeyState, pt, pdwEffect)
COM Error:80de0001 Unknown Error 0x80DE0001
Error:80de0001  in :: DoDragDrop( pcd, IDropSourcePtr(new GlassDropSource(obj), getDROPEFFECT(supportedActions, &performedDropEffect)
COM Error:80de0001  Unknown error 0x80DE0001

Eclipse 中的打印输出如下所示:(全为双倍行距)

我真的不知道为什么会这样——我显然做错了什么。该错误并未将我指向任何代码行。我会建议错误是指内存地址?请问您能帮帮我吗?

执行拖放功能的侦听器/处理程序是:

    root.setOnMouseEntered(new EventHandler<MouseEvent>(){
        @Override
        public void handle(MouseEvent arg0) {
            root.setStyle(highlightBackgroundStyle);
            parentScene.setCursor(Cursor.OPEN_HAND);
        }

    });

    root.setOnMouseExited(new EventHandler<MouseEvent>(){
        @Override
        public void handle(MouseEvent arg0) {
            root.setStyle(backgroundStyle);
            //parentScene.setCursor(Cursor.DEFAULT);
        }

    });

    root.setOnDragDetected(new EventHandler<MouseEvent>(){
        @Override
        public void handle(MouseEvent arg0) {
            parentScene.setCursor(Cursor.CLOSED_HAND);
            Dragboard db = parentScene.startDragAndDrop(TransferMode.COPY);

             ClipboardContent content = new ClipboardContent();
             content.putString(mediaFile.toURI().toString());
             db.setContent(content);
             arg0.consume();
        }

    });



    mediaPanel.getDropZoneA().setOnDragDropped(new EventHandler<DragEvent>(){

        @Override
        public void handle(DragEvent arg0) {
            mediaPanel.getMixerA().dragGraphicsOff();


            Dragboard db = arg0.getDragboard();
            if (db.hasString())
            {
                //System.out.println(db.getString());
                String mediaURI = db.getString();
                System.out.println(mediaURI);
                mediaPanel.getMixerA().getJfxMediaPlayer().loadAndPlayMediaA(new Media(mediaURI));
                mediaPanel.getMixerA().prepareMedia();

                arg0.setDropCompleted(true);
            }else{System.out.println("Drag error");arg0.setDropCompleted(false);}

            arg0.consume();
        }

    });

    mediaPanel.getDropZoneA().setOnDragExited(new EventHandler<DragEvent>(){

        @Override
        public void handle(DragEvent arg0) {
            mediaPanel.getMixerA().dragGraphicsOff();              
            arg0.consume();
        }

    });


    mediaPanel.getDropZoneA().setOnDragOver(new EventHandler <DragEvent>() {
        public void handle(DragEvent arg0) {
            mediaPanel.getMixerA().dragGraphicsOn();

            if (arg0.getGestureSource() != mediaPanel.getDropZoneB() && arg0.getDragboard().hasString())
            {
                arg0.acceptTransferModes(TransferMode.COPY);
            }
            arg0.consume();
        }
    });

更新 1

我想知道这是否是由我为 MediaPlayer“更改”媒体的方式引起的。我执行以下操作:

public void loadAndPlayMediaA(Media playableMedia)
{
    if((player != null))
    {
        player.stop();
    }
    media = playableMedia;
    player = new MediaPlayer(media);

    player.play();
}

然后我立即调用:

public void prepareMedia()
{

    view.setMediaPlayer(jfxMediaPlayer.getMediaPlayer());
    view.setPreserveRatio(preserveRatio);
    view.setFitWidth(miniaturePlayerX);
    view.setFitHeight(miniaturePlayerY);
    playerSlider.setValue(0.0);

}

...关键行是player = new MediaPlayer(media);。我想知道我是否偶尔会遇到 MediaView 试图获取下一帧的瞬间,但由于媒体已被重新实例化而失败。 (?)

加载新视频的最佳方式是什么?

【问题讨论】:

    标签: eclipse events callback javafx media


    【解决方案1】:

    我不知道您是否还没有找到解决方案... 我遇到了同样的问题并通过以下代码解决了它:

    setOnDragDropped(new EventHandler<DragEvent>()
                {
                    @Override
                    public void handle(DragEvent event)
                    {
                        System.out.println("onDragDropped");
                        event.setDropCompleted(true);
                    }
                });
    
    setOnDragExited(new EventHandler<DragEvent>()
                {
                    @Override
                    public void handle(DragEvent event)
                    {
                        System.out.println("onDragExited");
                        Dragboard db = event.getDragboard();
                        ArrayList<Object> f = (ArrayList<Object>) db.getContent(DataFormat.FILES);
                        for(Object o:f)
                            System.out.println(o.getClass().getName() + ":" + o);
                        File file = (File) f.get(0);
                        newMedia(file.toURI());
                    }
                });
    
    setOnDragOver(new EventHandler<DragEvent>()
                {
                    @Override
                    public void handle(DragEvent event)
                    {
                        System.out.println("onDragOver");
                        event.acceptTransferModes(TransferMode.ANY);
                    }
                });
    
    public void newMedia(URI uri)
    {
        m = new Media(uri.toASCIIString());
        mp = new MediaPlayer(m);
        mV = new MediaView(mp);
    
    
        mp.setOnReady(new Runnable()
        {
            @Override
            public void run()
            {
                mp.play();
            }
        });
    }
    

    在 DragDropped 处理程序中,我调用 setDropCompleted 来调用 DragExited 处理程序。然后我从 Dragboard 中取出文件并创建一个新的 MediaPlayerInstance。然后,你不能立即调用 play,否则什么都不会发生。您需要在 OnReady 处理程序中调用 play,或者至少在 MediaPlayer 的状态更改为 Ready 之后调用。 错误仍然会出现,但它现在应该可以工作了;)

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      相关资源
      最近更新 更多