2017-03-16 197 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