timedisplaycontrol.java
来自「FMJ(freedom media for java)是java视频开发的新选择」· Java 代码 · 共 268 行
JAVA
268 行
package net.sf.fmj.ejmf.toolkit.gui.controls;import java.awt.BorderLayout;import java.awt.Component;import javax.media.Control;import javax.media.Controller;import javax.media.ControllerErrorEvent;import javax.media.ControllerEvent;import javax.media.ControllerListener;import javax.media.StartEvent;import javax.media.StopEvent;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.SwingUtilities;import javax.swing.border.Border;import javax.swing.border.CompoundBorder;import javax.swing.border.EmptyBorder;import javax.swing.border.EtchedBorder;import javax.swing.border.TitledBorder;import net.sf.fmj.ejmf.toolkit.util.SourcedTimer;import net.sf.fmj.ejmf.toolkit.util.SourcedTimerEvent;import net.sf.fmj.ejmf.toolkit.util.SourcedTimerListener;import net.sf.fmj.ejmf.toolkit.util.TimeSource;/*** A read-only Control that displays media time.* <p>* Creates a SourcedTimer to generate ticks that trigger* Control to look at media time, convert it to a string* and display it.* <p>* Registers as SourcedTimerListener and ControllerListener.* As ControllerListener, TimerDisplayControl listens for* start/restart and stop events to correctly turn SourcedTimer* on and off.** @see net.sf.fmj.ejmf.toolkit.util.SourcedTimer* @see net.sf.fmj.ejmf.toolkit.util.SourcedTimerListener* @see net.sf.fmj.ejmf.toolkit.util.TimeSource*/public class TimeDisplayControl implements Control, SourcedTimerListener, TimeSource, ControllerListener { private JLabel timerField = new JLabel("0:00:00", JLabel.RIGHT); private JPanel controlComponent = new JPanel(); private String timeVal; private SourcedTimer timer; private Controller controller; private long divisor; /** * Create a TimeDisplayControl for displaying the * current media time of the Controller passed as an * argument. * @param controller The Controller with which to associate * control. */ public TimeDisplayControl(Controller controller) { this.controller = controller; // Create a timer and listener for 'ticks' timer = new SourcedTimer(this); timer.addSourcedTimerListener(this); // SourcedTimer units divided by divisor // equals seconds. divisor = timer.getConversionDivisor(); controller.addControllerListener(this); setUpControlComponent(); // Initialize time label timeVal = convertTime(getTime(), divisor); loadTime(); } /** * Create a TimeDisplayControl for displaying the * current media time of the Controller passed as an * argument. * <p> * The <code>timer</code> is used as the SourcedTimer. * This form of the constructor allows reuse of an existing * SourcedTimer. * * @param controller javax.media.Controller * @param timer ejmf.toolkit.util.SourcedTimer * * @see net.sf.fmj.ejmf.toolkit.util.SourcedTimer */ public TimeDisplayControl(Controller controller, SourcedTimer timer) { this.controller = controller; // Create a timer and listener for 'ticks' this.timer = timer; timer.addSourcedTimerListener(this); // SourcedTimer units divided by divisor // equals seconds. divisor = timer.getConversionDivisor(); controller.addControllerListener(this); setUpControlComponent(); // Initialize time label timeVal = convertTime(getTime(), divisor); loadTime(); } /** * Return the control component. * * @return java.awt.Component */ public Component getControlComponent() { return controlComponent; } /** * Build border and title the control component. */ private void setUpControlComponent() { JLabel timeLabel = new JLabel("Media Time:", JLabel.RIGHT); JPanel mainPanel = new JPanel(); int GAP = 10; Border emptyBorder = new EmptyBorder(GAP,GAP,GAP,GAP); Border etchedBorder = new CompoundBorder( new EtchedBorder(), emptyBorder); Border titledBorder = new TitledBorder( etchedBorder, "Time Display Control"); mainPanel.setBorder(titledBorder); mainPanel.setLayout( new BorderLayout(GAP, GAP) ); mainPanel.add(timeLabel, BorderLayout.CENTER); mainPanel.add(timerField, BorderLayout.EAST); controlComponent.add(mainPanel); } /** * Input value expected in nanoseconds and converted * to a String in h:mm:ss format. * * @param longTime time in unit such that <code>longTime/d</code> * results in seconds. * @param value such that <code>longTime/d</code> * results in seconds. * * @return java.awt.String representation of converted time */ private String convertTime(long longTime, long d) { int hr = 0; int min = 0; long sec = longTime / d; min = (int) (sec / 60); if (min > 0) { if (min > 60) { hr = min / 60; min = min % 60; } sec = sec % 60; } String t = hr + ":"; if (min < 10) { t = t + 0 + min + ":"; } else { t = t + min + ":"; } if (sec < 10) { t = t + 0 + sec; } else { t = t + sec; } return t; } // All but writing to text field is done before // call to loadTime. We don't want to do any conversion // on event thread. /* * Display the current media time. */ private void loadTime() { timerField.setText(timeVal); } /* * Write time to GUI. Convenience class for * execution on AWT thread. */ class LoadTimeThread implements Runnable { public void run() { loadTime(); } } //////////// SourcedTimerListener interface //////////// /** * Respond to 'tick' from SourcedTimer. * <p> * @param e a SourcedTimerEvent containing TimeSource * that generated tick. */ public void timerUpdate(SourcedTimerEvent e) { timeVal = convertTime(getTime(), divisor); SwingUtilities.invokeLater(new LoadTimeThread()); } ///////// ControllerListener Interface ///////////// /** * Listen for start/stop events and start/stop * SourceTimer in response. * @param e A controller event used to determine start/stop * state of timer. */ public void controllerUpdate(ControllerEvent e) { if (e instanceof StopEvent || e instanceof ControllerErrorEvent) { timer.stop(); } else if (e instanceof StartEvent) { timer.start(); } } ////////// TimeSource Interface ////////////// /** * Report media time from associated Controller. * <p> * @return media time in nanoseconds */ public long getTime() { return controller.getMediaNanoseconds(); } /** * Report value such that <code>getTime()/number</code> equals seconds. * <p> * @return a long such that <code>getTime()/number</code> equals * seconds. */ public long getConversionDivisor() { return TimeSource.NANOS_PER_SEC; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?