java - 将 MouseListener 与 vlcj 一起使用

标签 java swing canvas mouselistener vlcj

我目前正在开发一个 Java 界面,它需要循环播放 HomeVideo,直到有人单击它来访问该程序。我正在使用 vlcj 来读取视频,效果很好。

但是,我需要检测是否有人点击视频。遗憾的是,正如 wiki 中提到的,媒体播放器需要放置在重量级组件中,这意味着我必须将其放置在 Canvas 下(这是一个 AWT 对象,而不是 Swing 对象)。因此解决方案here似乎不适用于我的问题。

从那时起,我无法检测到视频中的任何点击(即使它在 Canvas 之外工作)。

我知道也可以将媒体播放器直接放置在 JFrame 中:

JFrame frame = new JFrame("My First Media Player");
frame.setBounds(100, 100, 600, 400);
mediaPlayerComponent = new EmbeddedMediaPlayerComponent();
frame.setContentPane(mediaPlayerComponent);
frame.setVisible(true);
mediaPlayerComponent.getMediaPlayer().playMedia("./Video.mp4");

但这在这里似乎不可能:我正在使用 CardLayout 来浏览我的 JPanel,包括包含媒体播放器的主页。

这是一个带有 vlcj-3.10.1jna-4.1.0jna-platform-4.1.0slf4j-api-1.7.24(和 slf4j-simple-1.7.24),它在 JPanel 中包含的 Canvas 中执行 vlcj,并附加了 MouseListener。当我们点击视频时,没有任何反应,但如果我们点击外部(即 Canvas ),我们就会得到坐标。

public class mediaplayer {

    JFrame frame;
    JPanel p;
    Canvas c;

    public static void main(final String[] args) {
        new NativeDiscovery().discover();
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new mediaplayer(args);
            }
        });
    }    

    private mediaplayer(String[] args) {
        frame = new JFrame("vlcj player");
        frame.setSize(1200, 800);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        p = new JPanel();
        p.setLayout(null); // Absolute positionning
        p.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                double x = me.getX();
                double y = me.getY();
                System.out.println("X and Y: " + x + " " + y);
            }
        });

        // heavyweight component where to place MediaPlayer
        c = new Canvas();
        c.setBackground(Color.black);
        c.setBounds(0, 0, 1000, 560);

        p.add(c);

        frame.add(p, BorderLayout.CENTER);

        MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory();
        EmbeddedMediaPlayer mediaPlayer = mediaPlayerFactory.newEmbeddedMediaPlayer();
        mediaPlayer.setVideoSurface(mediaPlayerFactory.newVideoSurface(c));
        mediaPlayer.setRepeat(true);
        mediaPlayer.prepareMedia("./Video.mp4");
        mediaPlayer.play();
    }
}

是否有任何方法可以在 Canvas 上使用 MouseListener,或者以允许检测鼠标点击的方式使用 vlcj?提前致谢,

我在这里要求的是一个解决方案,通过使用其他东西(而不是 Canvas)或解决方法来解决 AWT.Canvas 和 Swing 之间缺乏连接的问题。

最佳答案

在 Linux 和 Windows 上使用 vlcj,将 MouseListener 添加到视频表面 Canvas 应该可以正常工作。

如果您使用 vlcj MediaPlayerComponent 封装,则这有效(至少对我来说):

mediaPlayerComponent.getVideoSurface().addMouseListener(listener);

如果您不使用 MediaPlayerComponent,则只需将监听器直接添加到 Canvas 即可。

关于java - 将 MouseListener 与 vlcj 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42832693/

相关文章:

c# - 用于操作文本的小型 Java 或 C# 片段

java - 在 Java 中为 TreeMap 编写自定义排序时出现错误

java - 如何从具有 GridBagLayout 布局的 JPanel 中获取位于特定 gridx、gridy 中的组件?

javascript - 如何获取远程图像以在 Canvas 中显示?

java - 使用 LinkedHashMap 的字符串中的第一个唯一字符

java - 如何使用列表随机化 netbeans 中的数组?

java - 从 JComboBox 控件重绘

java - 在java小程序中加载面板内容

javascript - 如何在 Canvas 上填充图案并沿着形状弯曲?

javascript - 将值从文本字段传递到 HTML Canvas