簡體   English   中英

Java-將JFrame傳輸到JPanel

[英]Java - Transfer JFrame to JPanel

我有擴展JFrame的視頻播放器類,因為我需要在舞台上運行此框架(通過使用SwingNode來使用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,請執行以下操作:

  1. 將“ 公共類MediaPlayerDemo擴展JFrame ”更改為“ 公共類MediaPlayerDemo擴展JPanel
  2. 刪除show()setSize(..)app.addWindowListener(..)
  3. 用“ this ”替換“ getContentPane()

編輯:您還應該替換super(“ Demonstrating the Java Media Player”) ; super(new BorderLayout()); –埃里克·萊本古斯(Eric Leibenguth)

JFrame中的show()也已棄用,這意味着您不應使用它。 使用setVisible(true);

您也可以將框架關閉事件替換為框架。 setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

祝您的視頻播放器好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM