我有一个实现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());
}
问题是,我只是从点击它开始的时间。第二件事是按钮变得无法点击,因为它仍在运行,有没有办法让它在代码仍在后台运行时再次点击?谢谢你的帮助。
答案 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