在系统中获取系统时间

时间:2013-03-14 17:29:23

标签: java swing time system actionlistener

我有一个实现Actionlistener的类。单击此类中的按钮后,我希望它在我指定的,之前和其他地方的确切时间执行某些操作。所以我做了这些课程:

class DoSomething implements ActionListener{
     public void actionPerformed(ActionEvent a){
     while(true){
         String test = obtainTime.time;

    if(test.matches("(.*)17:29:30(.*)")){
         Class.doSomethingMethod();
    }
        //Rest of the code
     }
     }
}

class ObtainTime{
     static DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
     static Calendar cal = Calendar.getInstance();
     static String time = dateFormat.format(cal.getTime());
}

问题是,我只是从点击它开始的时间。第二件事是按钮变得无法点击,因为它仍在运行,有没有办法让它在代码仍在后台运行时再次点击?谢谢你的帮助。

4 个答案:

答案 0 :(得分:1)

如果您正在快速做某事和/或需要在达到目标时间时更新用户界面,则需要使用Java Swing Timer。有关此问题的更多文档,请访问:Oracle's Swing Timer tutorial。如果您正在执行长期任务,则需要遵循andersoj的建议并使用预定的执行程序。

答案 1 :(得分:0)

如果你想做几件事,你必须使用线程..你可以通过Thread扩展你的课程或实施Runnable interface来做到这一点。 可以找到两种方式的好教程here

获得时间&在格式中的日期,与您的模式相匹配,请检查this document,在哪里可以找到日期和日期的模式。时间在java。

答案 2 :(得分:0)

你的第一个问题:虽然令人困惑,但我想你在问为什么你只能按第一次按下按钮来测量时间。答案是因为当您第一次按下按钮时,会加载ObtainTime类。当您加载该类时,只运行一次静态初始化程序。这一行:

static String time = dateFormat.format(cal.getTime());

是静态初始化程序。你可能想做的事情更像是这样:

class DoSomething implements ActionListener{

  private final ScheduledExecutor scheduler = executors.newSingleThreadScheduledExecutor();
  private final long timeToRunAction;

   DoSomething(long timeToRunAction) {
     this.timeToRunAction = timeToRunAction;
   }

   public void actionPerformed(ActionEvent a)
   {
     long currentTime = System.currentTimeMillis();
     long delayTime = timeToRunAction - currentTime;
     scheduler.schedule(new Runnable() {
         public void run() { Class.doSomethingMethod(); }
     }, delayTime, TimeUnit.MILLISECONDS);
   }
}

如果您使用此类,那么在实例化它时,您可以在构造函数中指定目标时间。您可能希望这更加动态,这很好,您只需使timeToRunAction字段可变并提供设置它的方法。此处的时间以unix时代的毫秒数指定。如果你需要做一些日历魔法来计算你的目标时间,我就把它留下了。

您的第二个问题:我强烈建议您使用ScheduledExecutor.schedule()执行此操作,而不是滚动自己的并发性。您需要使用日历来计算安排活动的正确延迟时间(可能以毫秒为单位)。

答案 3 :(得分:0)

看起来您正在使用Swing作为GUI API。您应该使用javax.swing.SwingWorker来实现您的目标。它可以按如下方式完成:

import javax.swing.*;
import java.util.*;
import java.text.*;
import java.awt.*;

public class SWorker extends JFrame
{
    JLabel label ;
    DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    Calendar cal = Calendar.getInstance();
    static SwingWorker worker;
    public void createAndShowGUI()
    {
        setTitle("SwingWorker Demo");
        label = new JLabel();
        getContentPane().add(label,BorderLayout.NORTH);
        setSize(300,200);
        worker = new SwingWorker<String, String>() 
        {
            @Override
            public String doInBackground() 
            {
               cal = Calendar.getInstance();
               String test = dateFormat.format(cal.getTime());
               while (!(test.matches("(.*)23:41:30(.*)")) && ! isCancelled())
               {
                   publish(new String[] {test});
                    Thread.sleep(5);//Added to sleep the thread for 5 ms so that load could be shed from processor..
                   cal = Calendar.getInstance();
                   test = dateFormat.format(cal.getTime());
               }
               return test;
            }

            @Override
            public void done() //This method is called when doInBackground() finishes. i.e when pattern is matched
            {
                try
                {
                    //Call here the method that you want to call after the time matches.
                    label.setText(get() + " Time's up ...!!");  
                }
                catch (Exception ex){}

            }
            @Override
            public void process(java.util.List<String> chunks)
            {
                label.setText(chunks.get(chunks.size()-1));
            }
        };
        String time = dateFormat.format(cal.getTime());
        label.setText(time);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    public void start()
    {
        worker.execute();
    }
    public static void main(String st[])
    {
        SwingUtilities.invokeLater( new Runnable()
        {
            @Override
            public void run()
            {
                SWorker sWorker = new SWorker();
                sWorker.createAndShowGUI();
                sWorker.start();
            }
        });
    }
}

要详细了解如何使用SwingWorker查看此官方tutorial on SwingWorker