Java tutorial
/* Java Media APIs: Cross-Platform Imaging, Media and Visualization Alejandro Terrazas Sams, Published November 2002, ISBN 0672320940 */ import java.awt.*; import java.awt.event.*; import javax.media.*; import javax.media.protocol.*; import javax.media.control.*; import java.io.*; /******************************************************************************* * A Graphical application allowing the user to choose the media they wish to * play. PlayerOfMedia presents a Dialog in which the user may enter the URL of * the media to play, or select a file from the local system. * * @author Spike Barlow ******************************************************************************/ public class PlayerOfMedia extends Frame implements ActionListener, ControllerListener { /** Location of the media. */ MediaLocator locator; /** Player for the media */ Player player; /** Dialog for user to select media to play. */ Dialog selectionDialog; /** Buttons on user dialog box. */ Button cancel, open, choose; /** Field for user to enter media filename */ TextField mediaName; /** The menus */ MenuBar bar; Menu fileMenu; /** Dialog for informing user of errors. */ Dialog errorDialog; Label errorLabel; Button ok; /** Graphical component for controlling player. */ Component controlComponent; /** Graphical component showing what isbeing played. */ Component visualComponent; /** Graphical component to show download progress. */ Component progressBar; /** Sizes to ensure Frame is correctly sized. */ Dimension controlSize; Dimension visualSize; int menuHeight = 50; /** Directory user last played a file from. */ String lastDirectory = null; /** Flags indicating conditions for resizing the Frame. */ protected static final int VISUAL = 1; protected static final int PROGRESS = 2; /*************************************************************************** * Construct a PlayerOfMedia. The Frame will have the default title of * "Player of Media". All initial actions on the PlayerOfMedia object are * initiated through its menu (or shotcut key). **************************************************************************/ PlayerOfMedia() { this("Player of Media"); } /*************************************************************************** * Construct a PlayerOfMedia. The Frame will have the title supplied by the * user. All initial actions on the PlayerOfMedia object are initiated * through its menu (or shotcut key). **************************************************************************/ PlayerOfMedia(String name) { super(name); /////////////////////////////////////////////////////////// // Setup the menu system: a "File" menu with Open and Quit. /////////////////////////////////////////////////////////// bar = new MenuBar(); fileMenu = new Menu("File"); MenuItem openMI = new MenuItem("Open...", new MenuShortcut(KeyEvent.VK_O)); openMI.setActionCommand("OPEN"); openMI.addActionListener(this); fileMenu.add(openMI); MenuItem quitMI = new MenuItem("Quit", new MenuShortcut(KeyEvent.VK_Q)); quitMI.addActionListener(this); quitMI.setActionCommand("QUIT"); fileMenu.add(quitMI); bar.add(fileMenu); setMenuBar(bar); /////////////////////////////////////////////////////// // Layout the frame, its position on screen, and ensure // window closes are dealt with properly, including // relinquishing the resources of any Player. /////////////////////////////////////////////////////// setLayout(new BorderLayout()); setLocation(100, 100); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { if (player != null) { player.stop(); player.close(); } System.exit(0); } }); ///////////////////////////////////////////////////// // Build the Dialog box by which the user can select // the media to play. ///////////////////////////////////////////////////// selectionDialog = new Dialog(this, "Media Selection"); Panel pan = new Panel(); pan.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); mediaName = new TextField(40); gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 2; pan.add(mediaName, gbc); choose = new Button("Choose File..."); gbc.ipadx = 10; gbc.ipady = 10; gbc.gridx = 2; gbc.gridwidth = 1; pan.add(choose, gbc); choose.addActionListener(this); open = new Button("Open"); gbc.gridy = 1; gbc.gridx = 1; pan.add(open, gbc); open.addActionListener(this); cancel = new Button("Cancel"); gbc.gridx = 2; pan.add(cancel, gbc); cancel.addActionListener(this); selectionDialog.add(pan); selectionDialog.pack(); selectionDialog.setLocation(200, 200); //////////////////////////////////////////////////// // Build the error Dialog box by which the user can // be informed of any errors or problems. //////////////////////////////////////////////////// errorDialog = new Dialog(this, "Error", true); errorLabel = new Label(""); errorDialog.add(errorLabel, "North"); ok = new Button("OK"); ok.addActionListener(this); errorDialog.add(ok, "South"); errorDialog.pack(); errorDialog.setLocation(150, 300); Manager.setHint(Manager.PLUGIN_PLAYER, new Boolean(true)); } /*************************************************************************** * React to menu selections (quit or open) or one of the the buttons on the * dialog boxes. **************************************************************************/ public void actionPerformed(ActionEvent e) { if (e.getSource() instanceof MenuItem) { ////////////////////////////////////////////////// // Quit and free up any player acquired resources. ////////////////////////////////////////////////// if (e.getActionCommand().equalsIgnoreCase("QUIT")) { if (player != null) { player.stop(); player.close(); } System.exit(0); } ///////////////////////////////////////////////////////// // User to open/play media. Show the selection dialog box. ///////////////////////////////////////////////////////// else if (e.getActionCommand().equalsIgnoreCase("OPEN")) { selectionDialog.show(); } } ////////////////////// // One of the Buttons. ////////////////////// else { ///////////////////////////////////////////////////////////// // User to browse the local file system. Popup a file dialog. ///////////////////////////////////////////////////////////// if (e.getSource() == choose) { FileDialog choice = new FileDialog(this, "Media File Choice", FileDialog.LOAD); if (lastDirectory != null) choice.setDirectory(lastDirectory); choice.show(); String selection = choice.getFile(); if (selection != null) { lastDirectory = choice.getDirectory(); mediaName.setText("file://" + choice.getDirectory() + selection); } } /////////////////////////////////////////////// // User chooses to cancel opening of new media. /////////////////////////////////////////////// else if (e.getSource() == cancel) { selectionDialog.hide(); } /////////////////////////////////////////////////////// // User has selected the name of the media. Attempt to // create a Player. /////////////////////////////////////////////////////// else if (e.getSource() == open) { selectionDialog.hide(); createAPlayer(mediaName.getText()); } //////////////////////////////////////////// // User has seen error message. Now hide it. //////////////////////////////////////////// else if (e.getSource() == ok) errorDialog.hide(); } } /*************************************************************************** * Attempt to create a Player for the media who's name is passed the the * method. If successful the object will listen to the new Player and start * it towards Realized. **************************************************************************/ protected void createAPlayer(String nameOfMedia) { //////////////////////////////////////////////////////////// // If an existing player then stop listening to it and free // up its resources. //////////////////////////////////////////////////////////// if (player != null) { System.out.println("Stopping and closing previous player"); player.removeControllerListener(this); player.stop(); player.close(); } /////////////////////////////////////////////////////////// // Use Manager class to create Player from a MediaLocator. // If exceptions are thrown then inform user and recover // (go no further). ////////////////////////////////////////////////////////// locator = new MediaLocator(nameOfMedia); try { System.out.println("Creating player"); player = Manager.createPlayer(locator); } catch (IOException ioe) { errorDialog("Can't open " + nameOfMedia); return; } catch (NoPlayerException npe) { errorDialog("No player available for " + nameOfMedia); return; } ////////////////////////////////////////////////////////// // Player created successfully. Start listening to it and // realize it. ////////////////////////////////////////////////////////// player.addControllerListener(this); System.out.println("Attempting to realize player"); player.realize(); } /*************************************************************************** * Popup a dialog box informing the user of some error. The passed argument * isthe text of the message. **************************************************************************/ protected void errorDialog(String errorMessage) { errorLabel.setText(errorMessage); errorDialog.pack(); errorDialog.show(); } /*************************************************************************** * Resize the Frame (window) due to the addition or removal of Components. **************************************************************************/ protected void resize(int mode) { ////////////////////////////////////////// // Player's display and controls in frame. ////////////////////////////////////////// if (mode == VISUAL) { int maxWidth = (int) Math.max(controlSize.width, visualSize.width); setSize(maxWidth, controlSize.height + visualSize.height + menuHeight); } //////////////////////////////// // Progress bar (only) in frame. //////////////////////////////// else if (mode == PROGRESS) { Dimension progressSize = progressBar.getPreferredSize(); setSize(progressSize.width, progressSize.height + menuHeight); } validate(); } /*************************************************************************** * React to events from the player so as to drive the presentation or catch * any exceptions. **************************************************************************/ public synchronized void controllerUpdate(ControllerEvent e) { /////////////////////////////////////// // Events from a "dead" player. Ignore. /////////////////////////////////////// if (player == null) return; //////////////////////////////////////////////////////////// // Player has reached realized state. Need to tidy up any // download or visual components from previous player. Then // obtain visual and control components for the player,add // them to the screen and resize window appropriately. //////////////////////////////////////////////////////////// if (e instanceof RealizeCompleteEvent) { //////////////////////////////////////////////////// // Remove any inappropriate Components from display. //////////////////////////////////////////////////// if (progressBar != null) { remove(progressBar); progressBar = null; } if (controlComponent != null) { remove(controlComponent); validate(); } if (visualComponent != null) { remove(visualComponent); validate(); } /////////////////////////////////////////////////////// // Add control and visual components for new player to // display. ////////////////////////////////////////////////////// controlComponent = player.getControlPanelComponent(); if (controlComponent != null) { controlSize = controlComponent.getPreferredSize(); add(controlComponent, "Center"); } else controlSize = new Dimension(0, 0); visualComponent = player.getVisualComponent(); if (visualComponent != null) { visualSize = visualComponent.getPreferredSize(); add(visualComponent, "North"); } else visualSize = new Dimension(0, 0); ////////////////////////////////////////////////////////// // Resize frame for new components and move to prefetched. ////////////////////////////////////////////////////////// resize(VISUAL); System.out.println("Player is now pre-fetching"); player.prefetch(); } //////////////////////////////////////////////////////////// // Provide user with a progress bar for "lengthy" downloads. //////////////////////////////////////////////////////////// else if (e instanceof CachingControlEvent && player.getState() <= Player.Realizing && progressBar == null) { CachingControlEvent cce = (CachingControlEvent) e; progressBar = cce.getCachingControl().getControlComponent(); if (progressBar != null) { add(progressBar, "Center"); resize(PROGRESS); } } //////////////////////////////////////////////// // Player initialisation complete. Start it up. //////////////////////////////////////////////// else if (e instanceof PrefetchCompleteEvent) { System.out.println("Pre-fetching complete, now starting"); player.start(); } /////////////////////////////////////////////////////// // Reached end of media. Start over from the beginning. /////////////////////////////////////////////////////// else if (e instanceof EndOfMediaEvent) { player.setMediaTime(new Time(0)); System.out.println("End of Media - restarting"); player.start(); } ////////////////////////////////////////////////////////////// // Some form of error. Free up all resources associated with // the player, don't listen to it anymore, and inform the // user. ////////////////////////////////////////////////////////////// else if (e instanceof ControllerErrorEvent) { player.removeControllerListener(this); player.stop(); player.close(); errorDialog("Controller Error, abandoning media"); } } /*************************************************************************** * Create a PlayerOfMedia object and pop it up on the screen for the user to * interact with. **************************************************************************/ public static void main(String[] args) { PlayerOfMedia ourPlayer = new PlayerOfMedia(); ourPlayer.pack(); ourPlayer.setSize(200, 100); ourPlayer.show(); } }