我正在写一个小程序,根据按下哪个按钮来运行三个代码示例之一。使用第三个按钮,应该运行一个代码示例,直到JFrame关闭,或者直到按下按钮(我真的不介意它是如何停止的,只要用户有一个停止循环的方法)。代码已运行,并且添加了8秒的延迟以确保代码在循环之前完成运行。如何在Java中运行进程直到按下按钮?
我该如何实施?当循环时程序似乎不会终止,即使我试图通过单击JFrame中的关闭按钮来关闭程序。
该计划的主要部分如下所示:
public class WaspmoteSim extends JFrame implements ActionListener {
public WaspmoteSim() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
//getContentPane().setLayout(new GridLayout(1, 3, 10, 10));
getContentPane().setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(30,30,30,30);
c.ipadx = 10;
c.ipady = 30;
setSize(700, 150);
setLocation(100, 100);
JButton button1 = new JButton("Demonstration Mode");
button1.addActionListener(this);
add(button1, c);
JButton button2 = new JButton("Distribution Fitting Mode");
button2.addActionListener(this);
add(button2, c);
JButton button3 = new JButton("Operational Mode");
button3.addActionListener(this);
add(button3, c);
setVisible(true);
}
public static void main(String[] args) {
new WaspmoteSim();
}
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if (command.equals("Demonstration Mode")) {
try {
DemoMethod();
} catch (IOException ex) {
Logger.getLogger(WaspmoteSim.class.getName()).log(Level.SEVERE, null, ex);
}
}
if (command.equals("Distribution Fitting Mode")) {
try {
FittingMethod();
} catch (IOException ex) {
Logger.getLogger(WaspmoteSim.class.getName()).log(Level.SEVERE, null, ex);
}
}
if (command.equals("Operational Mode")) {
try {
OperationsMethod();
} catch (IOException ex) {
Logger.getLogger(WaspmoteSim.class.getName()).log(Level.SEVERE, null, ex);
} catch (InterruptedException ex) {
Logger.getLogger(WaspmoteSim.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
,我想在一个循环中运行的代码看起来是这样的:
public void OperationsMethod() throws IOException, InterruptedException {
while(true) {
String workingDir = System.getProperty("user.dir");
System.out.println(workingDir);
Process proc;
proc = Runtime.getRuntime().exec("cmd.exe /C C:\\Progra~1\\R\\R-3.2.1.\\bin\\Rscript.exe " + workingDir + "\\Fitter.r");
TimeUnit.SECONDS.sleep(8);
}
}
我仍然有执行你的例子有些麻烦; Java指出抽象方法Process需要一个空的列表来实例化,而不是一个String(这是我正在创建的进程名称)。我在做别的事吗? – Martin
回答更新,你这样做,你使用'Runtime.getRuntime()。exec(....)'来创建它。 –
谢谢;我会在一两个小时后回家,然后再尝试。非常感谢您的时间! – Martin