2012-08-04 115 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玩家恩。