用于视频的VLCJ鼠标事件输入

时间:2015-03-05 18:25:14

标签: jframe mouseevent vlcj

所以我读过一些旧的帖子(从2011年开始),Windows在播放视频时会出现支持鼠标事件的问题,并且必须使用一些Windows钩子。然后,我在此处找到了与此问题相关的最新帖子:https://github.com/caprica/vlcj/issues/78

在本文的最后,讨论了一种接收鼠标点击事件的方法,VLCJ的开发人员将其作为支持该功能的正常方式认可:

Canvas videoSurface = this.mediaPlayerComponent.getVideoSurface();
videoSurface.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("Click");
        media_clicked();
    }
});

除此之外,当我尝试它时,它没有用。

package test;

import com.sun.jna.NativeLibrary;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import javax.swing.JFrame;
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
import uk.co.caprica.vlcj.runtime.RuntimeUtil;

public class Test {

    public static void main(String[] args) {
        Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
        GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice device = environment.getDefaultScreenDevice();
        GraphicsConfiguration graphConfigure = device.getDefaultConfiguration();

        JFrame frame = new JFrame(graphConfigure);
        frame.setBackground(Color.BLACK);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setLocationRelativeTo(null);
        frame.setSize(dimension);
        frame.setUndecorated(true);
        frame.setVisible(true);

        NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "C:\\Program Files (x86)\\VideoLAN\\VLC");
        EmbeddedMediaPlayerComponent component = new EmbeddedMediaPlayerComponent();
        EmbeddedMediaPlayer player = component.getMediaPlayer();

        Canvas videoSurface = component.getVideoSurface();
        videoSurface.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("Click");
            }        

            @Override
            public void mousePressed(MouseEvent e) {
                System.out.println("Click");
            }
        });

        frame.getContentPane().add(component, BorderLayout.CENTER);
        frame.repaint();
        frame.setVisible(true);
        String currDir = System.getProperty("user.dir");
        player.playMedia(currDir + "\\sample_video_01.mp4");
    }
}

因此视频可以播放,但在视频播放时,即使点击屏幕,也无法在控制台中显示“Clicked”一词。我也尝试过frame.getContentPane().add(videoSurface, BorderLayout.CENTER);而不是frame.getContentPane().add(component, BorderLayout.CENTER);,但都无法打印“Clicked”。

我正在使用带有jna-3.5.2platform-3.5.2vlcj-3.1.0的NetBeans。任何指针都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

您链接到的vlcj项目问题页面引用了另一个问题,该问题有答案,包括完全正常运行的测试。

基本上你必须这样做(在Windows上):

player.setEnableMouseInputHandling(false);

也许这个:

player.setEnableKeyInputHandling(false);

你在这里告诉LibVLC的是“不要乱用鼠标(或键盘)事件”并将它们发送给我。

这不完全是故事......

对于要交付的键盘事件,您必须在应用程序中正确管理焦点。点击视频表面(取决于您的平台)自动获取焦点。

解决这个问题的一种方法是:

mediaPlayer.getVideoSurface().requestFocusInWindow();

这意味着当您的窗口被聚焦时,例如点击后,焦点将转移到您的视频表面。

这是测试用例的稳定链接:

https://github.com/caprica/vlcj/blob/vlcj-3.5.0/src/test/java/uk/co/caprica/vlcj/test/inputlistener/InputListenerTest.java

Linux上没有必要这样做。

答案 1 :(得分:0)

我正在为寻求像我这样的功能的人更新此功能。 在我使用的当前更新4.2.0中api发生了很大变化之后的4年,您必须执行以下操作

EmbeddedMediaPlayerComponent mpc1 = new EmbeddedMediaPlayerComponent();
mpc1.mediaPlayer().input().enableKeyInputHandling(false);
mpc1.mediaPlayer().input().enableMouseInputHandling(false);

如上所述,这将禁用vlcj视频表面组件中的处理,以后可以按如下使用

MouseListener l = new MouseListener() {

    @Override
    public void mouseReleased(MouseEvent e) {
        System.out.println("event detected mouseReleased");

    }

    @Override
    public void mousePressed(MouseEvent e) {
        System.out.println("event detected mousePressed");

    }

    @Override
    public void mouseExited(MouseEvent e) {
        System.out.println("event detected mouseExited");

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        System.out.println("event detected mouseEntered");

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("event detected mouseClicked");

    }
};

mpc1.videoSurfaceComponent().addMouseListener(l);