Java - 将 JFrame 传输到 JPanel

标签 java swing jframe jpanel media-player

我有扩展 JFrame 的视频播放器类,因为我需要在阶段中运行此帧(Jafafx 通过使用 SwingNode),我需要将此类传输到 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,请执行以下操作:

  1. 将“public class MediaPlayerDemo extends JFrame”更改为“public class MediaPlayerDemo extends JPanel
  2. 删除 show()setSize(..)app.addWindowListener(..)
  3. 将“getContentPane()”替换为“this

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

另外,JFrame 中的 show() 已被弃用,这意味着您不应该使用它。使用setVisible(true);

您还可以用框架替换窗口关闭事件。 setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

祝您的视频播放器好运!

关于Java - 将 JFrame 传输到 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30405579/

相关文章:

java - "PickList"的 Swing/AWT 实现

java - Wadl2Java SoapUI 生成错误

java - 百分比计算在 Java 中给我零

java - 将 ByteArray 从 PHP 发送到 Java

java - 如何指定一个字段,以便当我们查询时,使用该字段的 Joda LocalDate 或 LocalDateTime 值,将其映射到同一列?

java - 多次使用样式化的 JTextfField? (java)

java - 我需要有关“Deal or no Deal”Java 游戏的帮助

java - 如何在 jframe 标题栏上显示当前日期?

java - getWidth() 对于面板返回 0

swing - 如何在 jFrame 上创建带有关闭按钮的自定义标题栏?