如何选择时间/日期并将其放入计时器任务中



当我纠正了我对某些功能的使用而不是其他功能时,我发布了这个。我尝试使用JSpinner选择日期和时间,然后将其放入计时器,触发器必须是我选择的日期和时间。

我如何使用它来改变时间也通过移动箭头,并把日期和时间在计时器?

    import java.awt.BorderLayout;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JSpinner;
    import javax.swing.SpinnerDateModel;
    import javax.swing.SpinnerModel;
    import java.util.Calendar;
    import java.util.Date;
    import javax.swing.Timer;
    public class SpinnerDateSample {
     public static void main(String args[]) {
     JFrame frame = new JFrame("JSpinner Sample");
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     SpinnerModel model1 = new SpinnerDateModel();
     JSpinner spinner1 = new JSpinner(model1);
     spinner1.addChangeListener(new CalendarListener());
     JLabel label1 = new JLabel("Dates/Date");
     JPanel panel1 = new JPanel(new BorderLayout());
     panel1.add(label1, BorderLayout.WEST);
     panel1.add(spinner1, BorderLayout.CENTER);
     frame.add(panel1, BorderLayout.CENTER);
     frame.setSize(200, 90);
     frame.setVisible(true);
    }
   }
   private class CalendarListener implements ChangeListener {
    public void stateChanged(ChangeEvent e)  {
     JSpinner jSpinner = (JSpinner) e.getSource();
     Date date = (Date) jSpinner.getValue();
     long delay = date.getTime() - System.currentTimeMillis();
      timerStart();
      if (delay > 0) {
      timer.setInitialDelay((int) delay);
      timer.restart();
     }
    }   
   }
   TimerStart() {
    this.timer = new Timer(Integer.MAX_VALUE, (ActionEvent evt) -> {
     System.out.println("okey");
   });}

TimerTask是一个遗留类,相反,您可以使用ScheduledExecutorService按计划间隔执行任务,这是一个最佳实践,如下所示:

Selection6Runable类:

public class Selection6Runable implements Runnable {
         public void run() {
              //Add code for Selection6 Logic, 
             // this code will be run everytime when the scheduler runs
          }
     }

使用以上代码:

ScheduledExecutorService scheduledService= Executors.newScheduledThreadPool(1);
//Change the below time interval according 
//to the data received i.e., CalDcB.getSelectedItem()
scheduledService.scheduleAtFixedRate(()-> new Selection6Runable(), 
                        0, 1000L, TimeUnit.MILLISECONDS);

您可以在这里查看更多详细信息

最新更新