2015-03-05 6 views
0

Итак, я прочитал несколько старых сообщений (с 2011 года) о том, что Windows имеет проблемы с поддержкой событий мыши во время воспроизведения видео, и некоторые прокси-серверы Windows должны были использоваться. Затем я нашел более позднюю публикацию, связанную с этой проблемой: https://github.com/caprica/vlcj/issues/78VLCJ Mouse Event Input для видео

В конце этого сообщения обсуждается способ получения событий щелчка мыши, и разработчик VLCJ сам одобрил его как обычный способ поддержки Функциональность:

Canvas videoSurface = this.mediaPlayerComponent.getVideoSurface(); 
videoSurface.addMouseListener(new MouseAdapter() { 
    @Override 
    public void mouseClicked(MouseEvent e) { 
     System.out.println("Click"); 
     media_clicked(); 
    } 
}); 

За исключением случаев, когда я попробовал, это не сработало.

package test; 

import com.sun.jna.NativeLibrary; 
import java.awt.BorderLayout; 
import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.*; 
import java.awt.GraphicsConfiguration; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.Toolkit; 
import javax.swing.JFrame; 
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent; 
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer; 
import uk.co.caprica.vlcj.runtime.RuntimeUtil; 

public class Test { 

    public static void main(String[] args) { 
     Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); 
     GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     GraphicsDevice device = environment.getDefaultScreenDevice(); 
     GraphicsConfiguration graphConfigure = device.getDefaultConfiguration(); 

     JFrame frame = new JFrame(graphConfigure); 
     frame.setBackground(Color.BLACK); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     frame.setLocationRelativeTo(null); 
     frame.setSize(dimension); 
     frame.setUndecorated(true); 
     frame.setVisible(true); 

     NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "C:\\Program Files (x86)\\VideoLAN\\VLC"); 
     EmbeddedMediaPlayerComponent component = new EmbeddedMediaPlayerComponent(); 
     EmbeddedMediaPlayer player = component.getMediaPlayer(); 

     Canvas videoSurface = component.getVideoSurface(); 
     videoSurface.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       System.out.println("Click"); 
      }   

      @Override 
      public void mousePressed(MouseEvent e) { 
       System.out.println("Click"); 
      } 
     }); 

     frame.getContentPane().add(component, BorderLayout.CENTER); 
     frame.repaint(); 
     frame.setVisible(true); 
     String currDir = System.getProperty("user.dir"); 
     player.playMedia(currDir + "\\sample_video_01.mp4"); 
    } 
} 

Так что видео может играть, но не где в консоли фраза «Clicked» не печатается даже при нажатии на экран во время воспроизведения видео. Я также попробовал frame.getContentPane().add(videoSurface, BorderLayout.CENTER); вместо frame.getContentPane().add(component, BorderLayout.CENTER);, но ни один из них не смог напечатать «Щелкнуть».

Я использую NetBeans с jna-3.5.2, platform-3.5.2 и vlcj-3.1.0. Любой указатель был бы оценен.

ответ

0

Страница проблемы проекта vlcj, к которой вы привязаны, относится к другой проблеме, и эта проблема имеет ответ, включая полностью рабочий тест.

По сути вы должны сделать это (на Windows):

player.setEnableMouseInputHandling(false); 

А может быть, это:

player.setEnableKeyInputHandling(false); 

Что вы в основном говорить LibVLC здесь «не связываться с мышью (или клавиатуры), и отправьте их мне вместо этого.

Это не совсем вся история ...

Для событий клавиатуры, которые будут доставлены вам необходимо правильно управлять фокус в приложении. Нажатие на поверхность видео делает не (в зависимости от вашей платформы) автоматически захватывает фокус.

Один из способов решить, что это:

mediaPlayer.getVideoSurface().requestFocusInWindow(); 

Это означает, что, когда ваше окно фокусируется, например, нажав, фокус переместится на вашу видео поверхность.

Вот стабильная ссылка на тестовый пример:

https://github.com/caprica/vlcj/blob/vlcj-3.5.0/src/test/java/uk/co/caprica/vlcj/test/inputlistener/InputListenerTest.java

Ничего этого не надо на Linux.

+0

Мне потребовалось некоторое время, чтобы опробовать ваше решение, но оно действительно точно выполнило задачу. Я должен был иметь как '' 'player.setEnableMouseInputHandling (false), так и' '' player.setEnableKeyInputHandling (false); '' ', чтобы получить координаты, - с отсутствием какой-либо из них, это не сработало. Спасибо. –