2015-05-22 116 views
1

我有擴展JFrame的視頻播放器類,因爲我需要在舞臺(使用SwingNode的Jafafx)中運行此幀,所以我需要將此類傳遞給JPanel。 這可能嗎? 我試圖改變,但在EventHangler類中創建問題,而「visualComponent」不在面板中顯示,只有controlsComponent。Java - 將JFrame傳輸到JPanel

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(); 
     } 
    } 
    } 
} 

回答

0

要關閉的JFrame變成一個JPanel做到以下幾點:

  1. 更改 「公共類MediaPlayerDemo擴展JFrame的」 到 「公共類MediaPlayerDemo擴展JPanel
  2. 刪除秀(),setSize(..) and app.addWindowListener(..)
  3. 替換 「的getContentPane()」 與 「這個

編輯:你也應該更換超( 「展示了Java媒體播放器」);與super(新的BorderLayout());- 埃裏克Leibenguth

而且顯示(在JFrame中)已被棄用,這意味着你不應該使用它。使用setVisible(true);

您還可以用框架替換您的窗口關閉事件。 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

祝您的視頻播放器順利!

+0

這還不夠,仍然有錯誤... – Ramz

+0

有什麼錯誤? (我不熟悉你正在使用的庫) – ArgonBird18

+0

你也應該用'super(new BorderLayout())'替換'super(「演示Java媒體播放器」);'' –