我正在尝试将StartTime和EndTime添加到我的java GUI,因为将运行多个批处理文件,这将关闭一个cmd,启动另一个cmd,关闭此cmd并启动另一个直到所有批处理文件都执行(批处理文件)将根据用户的选项运行。
当用户点击" START"选项,批处理文件将运行。然后记录了StartTime,但是在所有cmd关闭之前不会显示(这是我在实施后发现的)。 当进程结束时,显示的StartTime是正确的。但显示的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相同?
答案 0 :(得分:2)
// Get system time
Date date = new Date();
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
您正在创建1个Date变量并使用它:
这里:JStartTimeTextField.setText(dateFormat.format(date));
和
这里JEndTimeTextField.setText(dateFormat.format(date));
初始化日期时,它不会随着时间的推移而改变。
要使此代码按预期工作,您需要在程序结束时获取新的日期和时间,而不是使用刚开始初始化的日期和时间。
//The processes end
Date newDate = new Date();
JEndTimeTextField.setText(dateFormat.format(newDate));
答案 1 :(得分:0)
在您的代码中,无法找到结束时间初始化并使用相同的日期实例作为开始时间和结束时间。
试试这个,
//The processes end
JEndTimeTextField.setText(dateFormat.format(new Date()));
答案 2 :(得分:0)
让我们从显而易见的......
开始Swing是一个单线程框架,即调用交互,修改和事件调度应该在Event Dispatching Thread的上下文中进行。任何阻止此线程的东西都会阻止它更新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));
在将date
JEndTimeTextField
之前,您只需创建{{1}}的新实例