2014-01-30 35 views
0

我已經創建了一個java swing應用程序,我使用VLCJ在畫布上運行視頻。一切都很好,但現在我需要添加播放/暫停按鈕和滑塊。所以我的問題是如何添加一個可以暫停我的視頻的actionlistener。這裏是我的代碼如何添加Actionlisteners到視頻應用程序

import java.awt.BorderLayout; 
import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.ComponentListener; 


import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

import uk.co.caprica.vlcj.binding.LibVlc; 
import uk.co.caprica.vlcj.player.MediaPlayerFactory; 
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer; 
import uk.co.caprica.vlcj.runtime.RuntimeUtil; 


import com.sun.jna.Native; 
import com.sun.jna.NativeLibrary; 
import com.sun.media.MediaPlayer; 

public class Player implements ActionListener{ 

    JButton b1; 
    Player vid = null; 
    JButton playbutton, pausebutton; 

    public static void main(final String[] args) { 
     NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "C:\\Program Files (x86)\\VideoLAN\\VLC"); 
     Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class); 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Player(args); 
      } 
     }); 
    } 

    private Player(String[] args) { 
     JFrame frame = new JFrame("vlcj Tutorial"); 


     MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory(); 

     Canvas c = new Canvas(); 
     c.setBackground(Color.black); 
     JPanel p = new JPanel(); 
     c.setBounds(100, 500, 1050, 500); 
     p.setLayout(new BorderLayout()); 
     p.add(c, BorderLayout.CENTER); 
     p.setBounds(100, 50, 1050, 600); 
     frame.add(p, BorderLayout.NORTH); 
     JPanel p1 = new JPanel(); 

     p1.setBounds(100, 900, 105, 200); 
     frame.add(p1, BorderLayout.SOUTH); 


     playbutton =new JButton(); 

     playbutton.setIcon(new ImageIcon("pics/playbutton.png")); 
     playbutton.setBounds(50, 50, 150, 100); 
     playbutton.addActionListener((ActionListener) this); 
     p1.add(playbutton); 

     pausebutton=new JButton(); 

     pausebutton.setIcon(new ImageIcon("pics/pausebutton.png")); 
     pausebutton.setBounds(80, 50, 150, 100); 

     p1.add(pausebutton); 



     EmbeddedMediaPlayer mediaPlayer = mediaPlayerFactory.newEmbeddedMediaPlayer(); 

     // c.addComponentListener((ComponentListener) mediaPlayer); 
     mediaPlayer.setVideoSurface(mediaPlayerFactory.newVideoSurface(c)); 

     frame.setLocation(100, 100); 
     frame.setSize(1050, 600); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     mediaPlayer.playMedia("D:\\Facebook.mp4"); 
     //NativeLibrary.addSearchPath("libvlc", "C:\\Program Files (x86)\\VideoLAN\\VLC"); 


    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     // TODO Auto-generated method stub 

    } 



} 

回答

0

在您執行的操作:

@Override 
    public void actionPerformed(ActionEvent ae) { 

    Object obj = ae.getSource(); 
    if(obj == btnPlayButton){ 
     //Play Your Video 
     } 
     if(obj == btnPauseVideo){ 
      //PAuse your Video 
     } 
    } 
0

你需要讓你的mediaPlayer參考聲明爲類領域,而不是你現在有一個自動堆變量。

這樣做的主要原因是確保它不是垃圾回收 - 否則當您的構造函數方法退出時,它就有資格進行垃圾回收。這是必要的,因爲媒體播放器組件正在包裝本地媒體播放器組件,並且如果您的Java對象實例消失,本機媒體播放器將在一段時間後崩潰 - 當它試圖回調您的Java對象時,它不在那裏。

這同樣適用於您的mediaPlayerFactory參考。

移動mediaPlayer變量類字段也使得它可以很容易地實現你的動作監聽:

@Override 
public void actionPerformed(ActionEvent e) { 
    Object obj = e.getSource(); 
    if (obj == btnPlayButton) { 
     mediaPlayer.getMediaPlayer().play(); 
    } 
    else if (obj == btnPauseVideo) { 
     mediaPlayer.getMediaPlayer().pause(); 
    } 
} 

有實施這些聽衆,例如許多方面您可以爲每個按鈕設置一個偵聽器,而不是像這樣共享偵聽器。

還有很多的例子在vlcj測試源顯示如何做到這一點。

https://github.com/caprica/vlcj/tree/master/src/test/java/uk/co/caprica/vlcj/test

+0

非常感謝卡布裏卡。有效!!! –

+0

這很好,也許你應該接受解決這個問題的答案? – caprica

相關問題