2012-08-04 64 views
1

,如果我直接使用vlcj顯示全屏那麼它是好的,但是當我最初設定一個固定的大小,後來在飛行中把它設置爲全屏那麼它losts它的渲染, 代碼:VLCJ未能切換全屏


panel_canvas=new JPanel(new BorderLayout()); 
    panel_canvas.add(windowsCanvas,BorderLayout.CENTER); 
    mediaPlayerFactory = new MediaPlayerFactory("--no-video-title-show"); 
    mediaPlayer = mediaPlayerFactory.newEmbeddedMediaPlayer();  
    mediaPlayer.setVideoSurface(mediaPlayerFactory.newVideoSurface(windowsCanvas)); 
    frame.setContentPane(panel_canvas); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
    frame.setLocationRelativeTo(null); 
    frame.setSize(600,500); 
    frame.setVisible(true); 

但如果我使用過程中,當按下 「Enter」 這將是全屏那麼它失敗

 frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("released ENTER"), "RELEASED_ENTER"); 
     frame.getRootPane().getActionMap().put("RELEASED_ENTER", new AbstractAction() {    
     @Override 
     public void actionPerformed(ActionEvent e) {     
     if(!frame.isUndecorated()){ 
      pres_size=frame.getSize();    
      prev_location=frame.getLocation(); 
      frame.dispose(); 
      frame.setUndecorated(true); 
      frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
      frame.setVisible(true); 
} 

回答

1

我申請在我的代碼下面的方法即可切換至全屏幕在Swing:

int lastState = 0; 
Rectangle lastBounds = null; 

private void toggleDecoration(boolean decorated) { 
    dispose(); 
    if (decorated) { 
     //save last bounds and its extended state 
     lastState = getExtendedState(); 
     lastBounds = getBounds(); 
     try{ 
      setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH); 
     } 
     catch(Exception ev){ 
      setBounds(getGraphicsConfiguration().getDevice().getDefaultConfiguration().getBounds()); 
      ev.printStackTrace(); 
     } 
    } 
    else { 
     //restore last bounds and its extended state 
     setBounds(lastBounds); 
     setExtendedState(lastState); 
    } 
    setUndecorated(decorated); 
    setVisible(true); 
} 

用法:

decorated = !decorated; 
toggleDecoration(decorated); 
+0

謝謝@ee for reply.i由於vlcj的「視頻表面」而面臨全屏問題,如果是的話,我的代碼適用於vlcj :),如果是的話,我可以獲得如何在vlcj的視頻表面上實現畫布的代碼:) – 2012-08-08 09:49:17

+0

我使用VLCJ的DirectMediaPlayer類調用VLCJ的RenderCallbackAdapter.onDisplay()方法,該方法允許VLC視頻緩衝區通過Swing中的Graphics.drawImage()方法被繪製爲BufferedImage實例幀的'paintComponent()'方法(VLC 1.2.0,libVLC 1.1.11)。這可以在VLCJ的示例源庫或其教程站點中作爲示例代碼提供。 – 2012-08-09 00:04:40

+0

再次感謝,試圖應用它,我會給你的反饋,如果我成功了@ee – 2012-08-10 17:13:28

0

我有同樣的問題,並解決了這個辦法:

@SuppressWarnings("deprecation") 
 
\t public static void toogleFullScreen(JFrame mainWindow) { 
 
\t \t boolean isPlaying = mainWindow.mediaPlayer.isPlaying(); 
 
\t \t if (isPlaying) { 
 
\t \t \t mainWindow.mediaPlayer.stop(); 
 
\t \t } 
 
\t \t if (!mainWindow.isUndecorated()) { 
 
\t \t \t mainWindow.dispose(); 
 
\t \t \t mainWindow.setAlwaysOnTop(true); 
 
\t \t \t mainWindow.setUndecorated(true); 
 
\t \t \t GraphicsEnvironment.getLocalGraphicsEnvironment() 
 
\t \t \t \t \t .getDefaultScreenDevice().setFullScreenWindow(mainWindow); 
 
\t \t \t BufferedImage cursorImage = new BufferedImage(1, 1, 
 
\t \t \t \t \t Transparency.TRANSLUCENT); 
 
\t \t \t mainWindow.setCursor(Toolkit.getDefaultToolkit() 
 
\t \t \t \t \t .createCustomCursor(cursorImage, new Point(0, 0), 
 
\t \t \t \t \t \t \t "InvisibleCursor")); 
 
\t \t \t mainWindow.setVisible(true); 
 
\t \t \t mainWindow.repaint(); 
 
\t \t } else { 
 
\t \t \t GraphicsDevice device = GraphicsEnvironment 
 
\t \t \t \t \t .getLocalGraphicsEnvironment().getDefaultScreenDevice(); 
 
\t \t \t DisplayMode modo = device.getDisplayMode(); 
 
\t \t \t mainWindow.dispose(); 
 
\t \t \t mainWindow.setAlwaysOnTop(false); 
 
\t \t \t mainWindow.setUndecorated(false); 
 
\t \t \t mainWindow.setBounds(modo.getWidth()/2, modo.getHeight()/2, 
 
\t \t \t \t \t modo.getWidth()/2, modo.getHeight()/2); 
 
\t \t \t device.setFullScreenWindow(null); 
 
\t \t \t mainWindow.setCursor(Cursor.DEFAULT_CURSOR); 
 
\t \t \t mainWindow.setVisible(true); 
 
\t \t \t mainWindow.repaint(); 
 
\t \t } 
 
\t \t if (isPlaying) { 
 
\t \t \t mainWindow.mediaPlayer.start(); 
 
\t \t } 
 
\t }

你只需要停止,同時集FullScre玩家恩。