Java-将JFrame传输到JPanel

Java-将JFrame传输到JPanel,java,swing,jframe,jpanel,media-player,Java,Swing,Jframe,Jpanel,Media Player,我有一个扩展JFrame的视频播放器类,因为我需要使用SwingNode在stage Jafafx中运行这个帧,我需要将这个类传输到JPanel。 这是可能的吗? 我试图更改,但在EventHangler类中产生了问题,并且visualComponent没有显示在面板中,只有controlsComponent import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; import jav

我有一个扩展JFrame的视频播放器类,因为我需要使用SwingNode在stage Jafafx中运行这个帧,我需要将这个类传输到JPanel。 这是可能的吗? 我试图更改,但在EventHangler类中产生了问题,并且visualComponent没有显示在面板中,只有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();
        }
     }
  }
}

要将JFrame转换为JPanel,请执行以下操作:

将公共类MediaPlayerDemo Extendes JFrame更改为公共类MediaPlayerDemo Extendes JPanel 删除显示,设置大小。。和app.addWindowListener。。 将getContentPane替换为以下内容 编辑:您还应该更换Java媒体播放器;具有超新的边框布局;——埃里克·莱本格斯

JFrame中的show也不推荐使用,这意味着您不应该使用它。使用setVisibletrue

您还可以在关闭时用frame.JFrame.EXIT\u替换窗口关闭事件


祝你的视频播放器好运

错误是什么?我不熟悉您正在使用的库,您还应该更换Java媒体播放器;超新的边界布局;