简体   繁体   中英

Java - Transfer JFrame to JPanel

I have video player class that extends JFrame, because I need to run this frame in stage (Jafafx by using SwingNode), I need to transfer this class to JPanel. This is possible? I tried to change, but created problems in EventHangler class, and "visualComponent" not show in the panel, only controlsComponent.

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.media.*;

public class MediaPlayerDemo extends JFrame {
  private Player player;
  private File file;

  public MediaPlayerDemo()
  {
     super( "Demonstrating the Java Media Player" );

     JButton openFile = new JButton( "Open file to play" );
     openFile.addActionListener(
        new ActionListener() {
           public void actionPerformed( ActionEvent e )
           {
              openFile();
              createPlayer();
           }
        }
     );
     getContentPane().add( openFile, BorderLayout.NORTH );

     setSize( 300, 300 );
     show();
  }

  private void openFile()
  {      
     JFileChooser fileChooser = new JFileChooser();

     fileChooser.setFileSelectionMode(
        JFileChooser.FILES_ONLY );
     int result = fileChooser.showOpenDialog( this );

     // user clicked Cancel button on dialog
     if ( result == JFileChooser.CANCEL_OPTION )
        file = null;
     else
        file = fileChooser.getSelectedFile();
  }

  private void createPlayer()
  {
     if ( file == null )
        return;

     removePreviousPlayer();

     try {
        // create a new player and add listener
        player = Manager.createPlayer( file.toURL() );
        player.addControllerListener( new EventHandler() );
        player.start();  // start player
     }
     catch ( Exception e ){
        JOptionPane.showMessageDialog( this,
           "Invalid file or location", "Error loading file",
           JOptionPane.ERROR_MESSAGE );
     }
  }

  private void removePreviousPlayer()
  {
     if ( player == null )
        return;

     player.close();

     Component visual = player.getVisualComponent();
     Component control = player.getControlPanelComponent();

     Container c = getContentPane();

     if ( visual != null ) 
        c.remove( visual );

     if ( control != null ) 
        c.remove( control );
  }

  public static void main(String args[])
  {
     MediaPlayerDemo app = new MediaPlayerDemo();

     app.addWindowListener(
        new WindowAdapter() {
           public void windowClosing( WindowEvent e )
           {
              System.exit(0);
           }
        }
     );
  }

  // inner class to handler events from media player
  private class EventHandler implements ControllerListener {
     public void controllerUpdate( ControllerEvent e ) {
        if ( e instanceof RealizeCompleteEvent ) {
           Container c = getContentPane();

           // load Visual and Control components if they exist
           Component visualComponent =
              player.getVisualComponent();

           if ( visualComponent != null )
              c.add( visualComponent, BorderLayout.CENTER );

           Component controlsComponent =
              player.getControlPanelComponent();

           if ( controlsComponent != null )
              c.add( controlsComponent, BorderLayout.SOUTH );

           c.doLayout();
        }
     }
  }
}

To turn the JFrame into a JPanel do the following:

  1. Change " public class MediaPlayerDemo extends JFrame " to " public class MediaPlayerDemo extends JPanel "
  2. Remove show() , setSize(..) and app.addWindowListener(..)
  3. Replace " getContentPane() " with " this "

EDIT: You should also replace super( "Demonstrating the Java Media Player" ) ; with super( new BorderLayout() ); – Eric Leibenguth

Also show() in JFrame is deprecated, meaning that you shouldn't use it. Use setVisible(true);

You can also replace your window closing event with frame. setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

Good luck with your video player!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM