我目前正在開發一個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