java中的endTime有些问题

我想添加一个StartTime和EndTime到我的Java GUI,因为将有多个batch file正在运行,这将closures一个cmd,启动另一个cmd,closures此cmd并启动另一个直到所有batch file都被执行(batch file将运行在用户的select)。

当用户点击“开始”选项时,batch file将运行。 然后开始时间已经被logging下来,但是直到所有cmd都closures时才会显示(这是我实现后发现的)。 当进程结束时,显示的开始时间是正确的。 但显示的EndTime和StartTime是一样的,这是错误的。 我该如何解决这个问题?

这是我的编码:

// Get system time Date date = new Date(); DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); // startTime GUI texts JLabel startTimeLabel = new JLabel("Start Time: "); startTimeLabel.setFont(new Font("Arial", Font.BOLD, 12)); startTimeLabel.setBounds(100, 245, 180, 53); contentPane.add(startTimeLabel); JStartTimeTextField = new JTextField(); JStartTimeTextField.setBounds(170,265,200,15); contentPane.add(JStartTimeTextField); JStartTimeTextField.setColumns(10); // endTime label JLabel endTimeLabel = new JLabel(" End Time: "); endTimeLabel.setFont(new Font("Arial", Font.BOLD, 12)); endTimeLabel.setBounds(100, 265, 180, 53); contentPane.add(endTimeLabel); JEndTimeTextField = new JTextField(); JEndTimeTextField.setBounds(170,285,200,15); contentPane.add(JEndTimeTextField); JEndTimeTextField.setColumns(10); //when start button is selected btnStart.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent args) { //StartTime JStartTimeTextField.setText(dateFormat.format(date)); try { //create new process String[] command = new String[]{"cmd", "/c", "start", "/wait", DetectDrive+"\\Starting.bat", filePath}; //run process Process p = Runtime.getRuntime().exec(command); //cause this process to stop until process p is terminated p.waitFor(); } catch (IOException | InterruptedException e1) { e1.printStackTrace(); } if(checkbox.isSelected()) { try { String[] command = new String[]{"cmd", "/c", "start", "/wait", DetectDrive+"\\Stage1.bat", filePath}; Process p = Runtime.getRuntime().exec(command); p.waitFor(); } catch (IOException | InterruptedException e1) { e1.printStackTrace(); } } ... (more coding on checkbox options) //The processes end JEndTimeTextField.setText(dateFormat.format(date)); } }); 

我发现我的编码看起来很好。 但是,当所有进程结束时,为什么StartTime和EndTime是一样的?

Solutions Collecting From Web of "java中的endTime有些问题"

// Get system time Date date = new Date(); DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

您正在创建1日期变量,您使用它:在这里: JStartTimeTextField.setText(dateFormat.format(date)); 和这里JEndTimeTextField.setText(dateFormat.format(date));

初始化日期时,不会随着时间的推移而改变。

要使代码按预期工作,您需要在程序结束时获取新的日期和时间,而不是在开始时初始化一次。

//The processes end Date newDate = new Date(); JEndTimeTextField.setText(dateFormat.format(newDate));

在您的代码中,无法找到结束时间的初始化,并使用相同的日期实例作为开始时间和结束时间。

试试这个,

  //The processes end JEndTimeTextField.setText(dateFormat.format(new Date())); 

让我们从明显的…

Swing是一个单线程框架,即调用交互,修改和事件派发应该在事件派发线程的上下文中发生。 任何阻止这个线程将阻止它更新UI,使它看起来像你的程序已经挂起,因为它基本上有…

所以,以下是你的第一个问题的关键…

 p.waitFor(); 

这是阻塞事件分派线程,阻止它更新UI直到过程返回并且actionPerformed方法存在。

为了解决这个问题,我建议你实现一个SwingWorker ,它允许你在后台运行这个进程,但是提供了可以安全地更新UI的方法。

 public class ProcessWorker extends SwingWorker<Date, Date> { public static final DateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); private String[] commands; private JTextField endTimeField; public ProcessWorker(JTextField endTimeField, String... commands) { this.commands = commands; this.endTimeField = endTimeField; } @Override protected Date doInBackground() throws Exception { Process p = Runtime.getRuntime().exec(commands); p.waitFor(); return new Date(); } @Override protected void done() { try { Date date = get(); endTimeField.setText(DATE_FORMAT.format(date)); } catch (InterruptedException | ExecutionException ex) { ex.printStackTrace(); } } } 

然后可以使用类似于…

 ProcessWorker pw = new ProcessWorker(JEndTimeTextField, "cmd", "/c", "start", "/wait", DetectDrive + "\\Stage1.bat", filePath); pw.execute(); 

你的第二个问题似乎更简单(但是由于一些代码已经从原来的一些代码中删除了,所以不可能确定),你正在用你用于开始时间的相同Date值更新结束时间…

 JStartTimeTextField.setText(dateFormat.format(date)); //... //The processes end JEndTimeTextField.setText(dateFormat.format(date)); 

您只需要在将其应用于JEndTimeTextField之前创建一个新的date实例

查看Swing和Worker线程和SwingWorker中的并发性以获取更多详细信息