2013-12-09 23 views
0

新年前夕即将到来,即时通讯思考什么是可能的方式来编程一个老式的倒数计时器到Java中使用它作为倒计时10秒。老式的Java倒计时闹钟

我想说的一个老式倒计时http://www.youtube.com/watch?v=9h7J5VWUOYw

什么,我能想到的只是利用一个JLabel做使用计时器一个简单的倒数计时器。

编辑:我所做的是使时钟全屏混合并在23点59分30秒打一个简单的倒计时视频VLCJ

public class TimerFrame extends JFrame{ 

    SimpleDateFormat dateFormatter = new SimpleDateFormat(" H:mm:ss"); 
    Date now = new Date(); 
    private JLabel lblTime = new JLabel(); 
    private final EmbeddedMediaPlayerComponent mediaPlayerComponent; 
    private String countdownVideo ="C:\\Users\\LT\\Desktop\\newyear\\cd2.mp4"; 
    private String vlcFolder = "C:/Program Files/VideoLAN/VLC"; 
    private java.util.Timer timerVideoRun = new java.util.Timer(); 
    private Timer timer; 

public TimerFrame() 
{ 
    //time for video to run on 
    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.HOUR_OF_DAY, 23); 
    calendar.set(Calendar.MINUTE, 59); 
    calendar.set(Calendar.SECOND, 30); 
    Date time = calendar.getTime(); 
    timerVideoRun.schedule(new saveTask(this), time);//schedule task on above time 

    //vlcj load 
    loadVLCJ(); 
    mediaPlayerComponent = new EmbeddedMediaPlayerComponent(); 

    //label time settings 
    timer = new Timer(1000, new MyListener(this)); //Tick every 1000ms, let MyListener listen to the ticks 
    timer.start(); //Start the timer 
    lblTime.setFont(new Font("Helvetica", Font.PLAIN, 270)); 
    lblTime.setVerticalAlignment(SwingConstants.CENTER); 
    lblTime.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
    updateLabelTime(); 

    //JFrame 
    add(lblTime, BorderLayout.CENTER); 
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    setUndecorated(true); 
    setResizable(false); 
    setVisible(true); 
    setExtendedState(JFrame.MAXIMIZED_BOTH); 
    mediaPlayerComponent.getMediaPlayer().prepareMedia(countdownVideo,":start-time=30"); 
} 

public void updateLabelTime() 
{ 
    now.setTime(System.currentTimeMillis()); 
    lblTime.setText(dateFormatter.format(now)); 

} 

public void playVideo() 
{ 
    timer.stop(); 
    setContentPane(mediaPlayerComponent); 
    validate(); 
    mediaPlayerComponent.getMediaPlayer().play(); 

} 

public void loadVLCJ() 
{ 
    NativeLibrary.addSearchPath(
      RuntimeUtil.getLibVlcLibraryName(), vlcFolder 
     ); 
     Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class); 
} 

} 

public class MyListener implements ActionListener { 

    TimerFrame frame; 
    public MyListener(TimerFrame timerFrame) { 
     this.frame = timerFrame; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // TODO Auto-generated method stub 
     this.frame.updateLabelTime(); 
    } 

} 

public class saveTask extends TimerTask { 

    TimerFrame frame; 
    public saveTask(TimerFrame timerFrame) { 
     this.frame = timerFrame; 
    } 

    @Override 
    public void run() { 
     this.frame.playVideo(); 

    } 

} 


public class TimerMain { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TimerFrame(); 
      } 
     }); 


    } 

} 

我想问的是,在方法调用playVideo()如果我是要评论出validate()方法,程序不会“切换”到视频中,有人知道为什么会发生这种情况,并且如果有更好的方法而不是通过调用validate()?

此外,如果任何人都有VLCJ的经验,视频可能会停止播放音频后,视频已经过了一段时间,然后我会播放另一个音频?

+1

我们在这里不是为了您的工作和/或研究,我们只是在这里为您的编码相关问题提供帮助。 – Vallentin

+0

嗨,对不起,以我目前的经验,我能想到的只是使用JLabel作为倒数计时器。你有什么想法可以请求其他StackExchange编程想法 – sutoL

+0

看看[如何使用Swing定时器](http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html)和[这个使用JodaTime的例子](http://stackoverflow.com/questions/16661971/java-calculate-pregnancy-algorithm/16662078#16662078)来计算两个日期/时间之间的差异... – MadProgrammer

回答

1

正如@Vallentin所说,我们不是在这里为你做你的工作或研究。但是,至少我会很乐意向您指出正确的方向。

如果你想动画和所有,你将不得不研究图形。至于倒计时本身,请创建一种方法,该计算方法将在倒计时中每秒通过setText()方法应用于您的标签。

如果您开始编写代码并遇到错误,请随时发布一些代码,告诉我们错误,并告诉我们您要完成的工作。