2013-12-24 2 views
0

Я пытаюсь воспроизвести видео из списков MRL, предоставленных в виде строки.Воспроизведение видео из массива vlcj player

Проблема заключается в том, что я пытаюсь запустить класс, список панелей отображается с кнопкой, только с одной панелью, но кнопка воспроизведения не работает, а кнопка воспроизведения других панелей.

Хотя я намеренно оставил кнопку остановки, потому что я не добавил к ним слушателей действий.

Что я хочу достичь, когда я запускаю класс, воспроизводится одно видео, и когда я нажимаю кнопку воспроизведения другого видео, текущее видео останавливается и переходит к следующему видео.

Я не знаю, где я поступил неправильно.

Вот мой код:

public class MediaPlayer extends JPanel { 

    //Declares our media player component 
    private EmbeddedMediaPlayerComponent[] mediaplayer; 
    private String[] mediapath = {""}; 
    private final String vlcpath = "C:\\Program Files (x86)\\VideoLAN\\VLC"; 
    private JPanel video_pnl, control_pnl; 
    private JButton[] play_btn, stop_btn; 
    private int but = 0; 

    public MediaPlayer(String mediapath[]) { 
     this.mediapath = mediapath; 

     play_btn = new JButton[1]; 
     stop_btn = new JButton[1]; 
     mediaplayer = new EmbeddedMediaPlayerComponent[1]; 
     int increment = 0; 
     while (increment < mediapath.length) { 
      video_pnl = new JPanel(); 
      video_pnl.setLayout(new BorderLayout()); 
      control_pnl = new JPanel(); 
      control_pnl.setLayout(new FlowLayout(FlowLayout.CENTER)); 
      for (int i = 0; i < 1; i++) { 

       NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), vlcpath); 
       mediaplayer[i] = new EmbeddedMediaPlayerComponent(); 
       play_btn[i] = new JButton("play"); 
       stop_btn[i] = new JButton("stop"); 


       video_pnl.add(mediaplayer[i], BorderLayout.CENTER); 

       control_pnl.add(play_btn[i]); 
       control_pnl.add(stop_btn[i]); 
       video_pnl.add(control_pnl, BorderLayout.SOUTH); 

       Handler handler = new Handler(); 
       play_btn[i].addActionListener(handler); 
      } 
      add(video_pnl); 
      increment++; 
     } 
    } 

    private class Handler implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if(e.getSource() == play_btn){ 
       play(); 
      } 
     } 
    } 

    public void play() { 
     for (int i = 0; i < mediapath.length; i++) { 
      mediaplayer[i].getMediaPlayer().playMedia(mediapath[i]); 
     } 
    } 

    public static void main(String[] args) { 
     //Declare and initialize local variables 
     String[] mediaPath =  {"C:\\\\Users\\\\goldAnthony\\\\Desktop\\\\Videos\\\\Whistle.mp4", "C:\\\\Users\\\\goldAnthony\\\\Desktop\\\\Videos\\\\Beyonce_Hello.mp4", 
     "C:\\Users\\goldAnthony\\Desktop\\Videos\\HansRosling_2012S_480p.mp4","C:\\Users\\goldAnthony\\Desktop\\Videos\\oow2010_2.mp4", 
     "C:\\Users\\goldAnthony\\Desktop\\Videos\\The_Economic_Environment.mp4"}; 

     //creates instances of the VlcPlayer object, pass the mediaPath and invokes the method "run" 
     MediaPlayer mediaplayer = new MediaPlayer(mediaPath); 
     JFrame ourframe = new JFrame(); 
     ourframe.setContentPane(mediaplayer); 
     ourframe.setLayout(new GridLayout(5, 1)); 
     ourframe.setSize(300, 560); 
     ourframe.setVisible(true); 
     mediaplayer.play(); 
     ourframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 
       control_pnl.add(play_btn[i]); 
       control_pnl.add(stop_btn[i]); 
       video_pnl.add(control_pnl, BorderLayout.SOUTH); 

       Handler handler = new Handler(); 
       play_btn[i].addActionListener(handler); 
      } 
      add(video_pnl); 
      increment++; 
     } 
    } 

    private class Handler implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if(e.getSource() == play_btn){ 
       play(); 
      } 
     } 
    } 

    public void play() { 
     for (int i = 0; i < mediapath.length; i++) { 
      mediaplayer[i].getMediaPlayer().playMedia(mediapath[i]); 
     } 
    } 

    public static void main(String[] args) { 
     //Declare and initialize local variables 
     String[] mediaPath =  {"C:\\\\Users\\\\goldAnthony\\\\Desktop\\\\Videos\\\\Whistle.mp4", "C:\\\\Users\\\\goldAnthony\\\\Desktop\\\\Videos\\\\Beyonce_Hello.mp4", 
     "C:\\Users\\goldAnthony\\Desktop\\Videos\\HansRosling_2012S_480p.mp4","C:\\Users\\goldAnthony\\Desktop\\Videos\\oow2010_2.mp4", 
     "C:\\Users\\goldAnthony\\Desktop\\Videos\\The_Economic_Environment.mp4"}; 

     //creates instances of the VlcPlayer object, pass the mediaPath and invokes the method "run" 
     MediaPlayer mediaplayer = new MediaPlayer(mediaPath); 
     JFrame ourframe = new JFrame(); 
     ourframe.setContentPane(mediaplayer); 
     ourframe.setLayout(new GridLayout(5, 1)); 
     ourframe.setSize(300, 560); 
     ourframe.setVisible(true); 
     mediaplayer.play(); 
     ourframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

ответ

2

BorderLayout.CENTER вашего JPanel video_pnl может содержать только один компонент. После завершения цикла конструктора он ссылается на последний добавленный mediaplayer[i]. В вашем слушателе вы можете использовать CardLayout для изменения панелей или обновления одной панели.

0

Ваш обработчик события имеет следующее:

if(e.getSource() == play_btn){ 

e.getSource() вернет кнопку, которая была нажата. Однако play_btn - это массив, а не кнопка. Поэтому вы сравниваете экземпляр массива и экземпляр кнопки для равенства, и это всегда будет ложным.

Один из способов добиться того, что вы хотите использовать команды действия:

play_btn[i] = new JButton("play"); 
play_btn[i].setActionCommand("play"); 

Вы можете изменить тест в обработчике событий для этого:

if(e.getActionCommand().equals("play") { 

Кстати, эту проблему действительно ничего общего с vlcj.

Смежные вопросы