我目前正在开发一个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.1
,jna-4.1.0
,jna-platform-4.1.0
,slf4j-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之间缺乏连接的解决方案。
首先,感谢您的快速回复!由于'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
我不确定你的意思。你真的应该检查vlcj例子和vlcj-player参考项目。我在vlcj的许多媒体播放器项目上使用CardLayout时没有任何问题。我使用鼠标监听器和画布没有任何问题。我通常在Swing应用程序中使用Canvas,没有任何问题。在Swing应用程序中使用重量级组件存在限制,但没有规定您*不能*。 – caprica
当您提到限制时,您的意思是我们不能在JLabel中使用半透明元素(徽标,...)放置在视频上方吗?与上面提到的问题没有关系,但有没有解决方法? 我目前正在修改我的代码以测试您所说的内容,谢谢。 – Iwerzhon