我有一个带有两个按钮的JFramePanel来运行这段代码:
public void runProc (){
while(true){
System.out.println("Running...");
PrintWriter outputStream = null;
try {
outputStream = new PrintWriter (FILENAME);
}
catch (FileNotFoundException e) {
try {
Process failedToWriteFile = Runtime.getRuntime().exec(DIALOGBOX);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}
outputStream.println("hello");
outputStream.close();
System.out.println("");
try {
TimeUnit.SECONDS.sleep(2);
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Path d= Paths.get(FILENAME);
try {
Files.delete(d);
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
TimeUnit.SECONDS.sleep(3);
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void killProc(){
System.exit(0);
}
当我按下Start时代码会运行但是当我按下Stop时它不会停止 单击开始按钮,停止按钮无效 我做错了什么?
答案 0 :(得分:1)
只有一个Thread可以处理GUI操作,例如单击按钮。虽然这个线程还没有完成他的工作,但GUI被冻结,并且不会对其他输入做出反应。
如果我想要一个按钮来启动更长的任务,它应该在一个额外的线程中完成,比如SwingWorker,并且只有该线程的开始应该在GUI线程内完成(例如actionPerformed-method)。
答案 1 :(得分:0)
我假设开始按钮直接调用runProc,这意味着它正在Event Dispatch线程上运行。 然后,此线程停留在while(true)循环中,并且永远不会返回到应用程序。即停止按钮永远不会有机会运行。
你的开始按钮应该使用SwingWorker和SwingUtilities来调用EDT之外的方法和一个布尔变量来启动和停止线程与System.exit(0)
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class TestProc{
boolean isRunning = false;
public TestProc(){
JFrame f = new JFrame();
JButton b = new JButton("Start");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new SwingWorker<Void, Void>() {
public Void doInBackground() {
if(!isRunning){
isRunning = true;
runProc();
}
return null;
}
}.execute();
}
});
JButton b1 = new JButton("End");
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
killProc();
}
});
}
});
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setContentPane(new JPanel());
f.getContentPane().add(b);
f.getContentPane().add(b1);
f.pack();
f.setVisible(true);
}
public void runProc (){
while(isRunning){
System.out.println(".");
try { Thread.sleep(100); } catch (InterruptedException e) {}
}
}
public void killProc(){
isRunning = false;
System.out.println("DEAD!");
}
public static void main(String args[]){
new TestProc();
}
}