2017-03-16 199 views
0

我目前正在开发一个Java接口,它需要循环一个HomeVideo,直到有人点击它来访问程序。我正在使用vlcj来阅读视频并且效果很好。在vlcj中使用MouseListener

但是,我需要检测是否有人点击视频。令人遗憾的是,在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)一个SSCCE这在包含在一个JPanel附加有一个的MouseListener画布执行vlcj。当我们点击视频时,没有任何反应,但如果我们点击外部(即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(); 
    } 
} 

有没有办法使用的MouseListener上画布,或者在某种程度上使用vlcj,它允许检测鼠标点击的方式?提前致谢,

我在这里问的是通过使用其他方法(比Canvas)或解决方法来解决AWT.Canvas和Swing之间缺乏连接的解决方案。

回答

0

使用Linux和Windows上的vlcj将MouseListener添加到视频表面Canvas应该以通常的方式工作。

如果使用vlcj MediaPlayerComponent封装,这(至少对我)的工作原理:

mediaPlayerComponent.getVideoSurface().addMouseListener(listener); 

如果不使用MediaPlayerComponent,那么就直接添加监听到你的Canvas

+0

首先,感谢您的快速回复!由于'MediaPlayerComponent'需要放在一个重量级的组件中(我想这里是一个'JFrame'),所以我看不到通过使用'CardLayout'来使用它的方法,所以看起来我会用第二个选项。从找到的信息[这里](http://stackoverflow.com/questions/9612684/drawing-in-java-using-canvas)和[这里](http://stackoverflow.com/questions/10556369/mouselistener-in -canvas-not-working)我认为在Swing环境中访问awt.Canvas信息并不是一个好习惯。我会记录下自己如何做到这一点,并告诉你结果。 – Iwerzhon

+0

我不确定你的意思。你真的应该检查vlcj例子和vlcj-player参考项目。我在vlcj的许多媒体播放器项目上使用CardLayout时没有任何问题。我使用鼠标监听器和画布没有任何问题。我通常在Swing应用程序中使用Canvas,没有任何问题。在Swing应用程序中使用重量级组件存在限制,但没有规定您*不能*。 – caprica

+0

当您提到限制时,您的意思是我们不能在JLabel中使用半透明元素(徽标,...)放置在视频上方吗?与上面提到的问题没有关系,但有没有解决方法? 我目前正在修改我的代码以测试您所说的内容,谢谢。 – Iwerzhon