import javax.media.*; import javax.swing.*; import javax.swing.SwingConstants.*; import java.awt.*; import java.awt.event.*; import java.net.*; import com.sun.j3d.utils.applet.MainFrame; import java.io.*; public class AHMedia extends JFrame implements ControllerListener, ActionListener { private Container con; private JPanel upp, ned, med; private JLabel text = new JLabel("Welcome to AHMediaPlayer v0.1"); private JFileChooser fd = null; private JMenuBar mb = new JMenuBar(); private JMenu m1 = null; private JMenu m2 = null; private JMenuItem open = null; private JMenuItem close = null; private JMenuItem om = null; private File filen = null; private Player spelare, nySpelare; private Component visualComponent = null; private Component controllerComponent = null; private Component progressBar = null; public AHMedia(){ con = getContentPane(); con.setLayout(new BorderLayout()); //initiera första panelen upp = new JPanel(new BorderLayout()); upp.setBackground(Color.BLUE); //initiera mellersta panelen med = new JPanel(new BorderLayout()); med.setBackground(Color.WHITE); //initiera nedre panelen ned = new JPanel(new BorderLayout()); ned.setBackground(Color.WHITE); //skapa menu items //MenuShortcut o = new MenuShortcut(KeyEvent.VK_O, false); open = new JMenuItem("Öppna", KeyEvent.VK_O); open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK)); open.addActionListener(this); //MenuShortcut c = new MenuShortcut(KeyEvent.VK_C, false); close = new JMenuItem("Stäng", KeyEvent.VK_C); close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK)); close.addActionListener(this); //skapa meny1 m1 = new JMenu("Arkiv"); m1.setMnemonic(KeyEvent.VK_A); //skapa meny2 m2 = new JMenu("Hjälp"); m2.setMnemonic(KeyEvent.VK_H); //lägg till i meny1 m1.add(open); m1.add(close); //lägg till i meny2 om = new JMenuItem("Om"); om.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.CTRL_MASK)); om.addActionListener(this); m2.add(om); //lägg till i menubaren mb.add(m1); mb.add(m2); //sätt font på JLabeln text.setFont(new Font("Monospaced", Font.PLAIN, 12)); //lägg till i panelerna upp.add("North", mb); ned.add("East", text); //lägg till i GUI:et con.add("North", upp); con.add("South", ned); con.add("Center", med); //se till att processen dödas när fönstret stängs addWindowListener(new CloseListener()); //sätt fönsterstorlek setSize(300, 200); //sätt titel setTitle("AHMediaPlayer v0.1"); //visa fönstret show(); }//konstruktor //startar applikationen public static void main(String args[]){ new AHMedia(); } //sätt texten i JLabeln public void setText(String txt){ text.setText(txt); } //hämta texten som finns i JLabeln public String getText(){ return text.getText(); } //hantera olika player-events public synchronized void controllerUpdate (ControllerEvent e){ if (e instanceof RealizeCompleteEvent) realizeComplete(); else if (e instanceof PrefetchCompleteEvent) prefetchComplete(); else if (e instanceof ControllerErrorEvent) controllerError(); else if (e instanceof ControllerClosedEvent) controllerClosed(); else if (e instanceof CachingControlEvent) caching(e); } //resurserna har samlat public void realizeComplete(){ visualComponent = spelare.getVisualComponent(); controllerComponent = spelare.getControlPanelComponent(); //placera ut de skapade komponenterna if(visualComponent != null) med.add("Center", visualComponent); if(controllerComponent != null) med.add("South", controllerComponent); validate(); spelare.prefetch(); } //laddningen av filen är klar, uppspelning kan börja public void prefetchComplete() { setText("Föreställningen kan börja!"); if(spelare.getTargetState() != Controller.Started) spelare.start(); //sätt JLabeln till namnet på filen setText(fd.getName(filen)); } //allvarligt spel hos Controllern har inträffat, stäng ned spelaren public void controllerError() { setText("Ett allvarligt fel har inträffat!"); spelare.close(); if(visualComponent != null) med.remove(visualComponent); if(controllerComponent != null) med.remove(controllerComponent); visualComponent = null; controllerComponent = null; spelare.removeControllerListener(this); spelare = null; } //ta bort komponenter från GUI:et vid ControllerClosed-event public void controllerClosed(){ //ta bort componenter if(visualComponent != null) remove(visualComponent); if(controllerComponent != null) remove(controllerComponent); //döda spelaren if(spelare != null) spelare.close(); spelare = null; //ta bort objekt som saknar referenser System.gc(); System.runFinalization(); } //fil laddas, försök visa progressbar public void caching(ControllerEvent e) { setText("Laddar...:"); }//caching //hantera händelser från menyn public void actionPerformed(ActionEvent evt) { //öppna fil if(evt.getSource() == open) open(); //stäng applikationen if(evt.getSource() == close) close(); //visa om-rutan if(evt.getSource() == om) om(); } //öppnar en fildialog och man får välja fil som sedan spelas public void open() { fd = new JFileChooser(); int i = fd.showOpenDialog(con); if(i == JFileChooser.APPROVE_OPTION){ //hämta fil filen = fd.getSelectedFile(); if(filen != null){ nySpelare = createPlayer(filen.toString()); //plocka bort ev spelare boolean closingdown = false; //döda ev. tidigare spelare if(spelare != null){ closingdown = true; spelare.close(); } if(nySpelare == null) return; //starta ny spelare if(!closingdown){ spelare = nySpelare; spelare.addControllerListener(this); spelare.realize(); } }//if (filen... }//if (i ==... }//open //skapa ny spelare med den valda filen public Player createPlayer(String filnamn){ Player nySpelare; try{ MediaLocator ml = new MediaLocator("file:"+filnamn); if(ml == null) return null; nySpelare = Manager.createPlayer(ml); } catch(Exception e){ setText("FEL:"+e.toString()); return null; } return nySpelare; }//createPlayer //stänger applikationen public void close() { //ta bort objekt som saknar referenser System.gc(); System.runFinalization(); System.exit(0); } //visar om-dialogen public void om() { JOptionPane.showInternalMessageDialog(con, "(C)Andreas Höglund 2003\n Enkel mediaspelare baserad på JMF.", "Om AHMediaPlayer", JOptionPane.INFORMATION_MESSAGE); } //dödar processen när fönstret stängs class CloseListener extends WindowAdapter{ public void windowClosing(WindowEvent evt){ System.exit(0); } }//CloseListener }