将 MouseListener 与 vlcj 一起使用
Using MouseListener with 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.1
、jna-4.1.0
、jna-platform-4.1.0
、slf4j-api-1.7.24
(和 slf4j-simple-1.7.24
)的 SSCCE,它在 [=36= 中执行 vlcj ] 包含在附加了 MouseListener 的 JPanel 中。当我们点击视频时,没有任何反应,但如果我们点击外部(即 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,或者有什么方法可以检测鼠标点击吗?提前致谢,
我在这里要问的是解决 AWT.Canvas 和 Swing 之间缺乏联系的问题,方法是使用其他方法(而不是 Canvas)或使用变通方法。
在 Linux 和 Windows 上使用 vlcj 将 MouseListener
添加到视频表面 Canvas
应该可以正常工作。
如果你使用 vlcj MediaPlayerComponent
封装,这有效(至少对我来说):
mediaPlayerComponent.getVideoSurface().addMouseListener(listener);
如果您不使用 MediaPlayerComponent
,则只需将您的侦听器直接添加到您的 Canvas
。
我目前正在开发一个 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.1
、jna-4.1.0
、jna-platform-4.1.0
、slf4j-api-1.7.24
(和 slf4j-simple-1.7.24
)的 SSCCE,它在 [=36= 中执行 vlcj ] 包含在附加了 MouseListener 的 JPanel 中。当我们点击视频时,没有任何反应,但如果我们点击外部(即 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,或者有什么方法可以检测鼠标点击吗?提前致谢,
我在这里要问的是解决 AWT.Canvas 和 Swing 之间缺乏联系的问题,方法是使用其他方法(而不是 Canvas)或使用变通方法。
在 Linux 和 Windows 上使用 vlcj 将 MouseListener
添加到视频表面 Canvas
应该可以正常工作。
如果你使用 vlcj MediaPlayerComponent
封装,这有效(至少对我来说):
mediaPlayerComponent.getVideoSurface().addMouseListener(listener);
如果您不使用 MediaPlayerComponent
,则只需将您的侦听器直接添加到您的 Canvas
。