如何取消 SwingWorker 线程中的 done()?
How to cancel done() in a SwingWorker thread?
我正在制作一个程序,它应该能够通过单击一个按钮来停止整个过程。
我已经使用sw.cancel(true);
这样做了,但是,SwingWorker
方法protected void done()
仍在运行。
我怎样才能按一下按钮取消整个事情?不只是 doInBackground()
方法?
对于感兴趣的人,下面是完整的相关代码:
sw = new SwingWorker() {
protected Object doInBackground() throws Exception {
//Pravljenje timera
t = new Timer(0, new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
//Provera stanja checkboxova
if(jCheckBox2.isSelected()) {
try {
int delay =(int) jSpinner2.getValue();
jCheckBox1.setSelected(false);
Thread.sleep(delay*60000);
} catch (InterruptedException ex) {
Logger.getLogger(App_Gui.class.getName()).log(Level.SEVERE, null, ex);
}
}
if(jCheckBox1.isSelected()) {
jCheckBox2.setSelected(false);
Date delay2 = (Date) jSpinner1.getValue();
userCal = Calendar.getInstance();
System.out.println("delay2: " + delay2);
userCal.setTime(delay2);
System.out.println("userCal:" + userCal);
Calendar sysCal = Calendar.getInstance();
System.out.println("sysCal: " + sysCal);
timerAtDate =
(((int) userCal.get(Calendar.HOUR_OF_DAY) - (int) sysCal.get(Calendar.HOUR_OF_DAY)) * 60 * 60 * 1000 +
((int) userCal.get(Calendar.MINUTE) - (int) sysCal.get(Calendar.MINUTE)) * 60 * 1000 +
((int) userCal.get(Calendar.SECOND) - (int) sysCal.get(Calendar.SECOND)) * 1000);
Thread.sleep(timerAtDate);
}
return null;
}
@Override
protected void done() {
System.out.println("Done!");
t.start();
t.setRepeats(false);
JDialog dialog = new JDialog();
dialog.setLocation(700, 300);
dialog.setSize(600, 400);
dialog.setVisible(true);
try {
Thread.sleep(jSlider1.getValue());
} catch (InterruptedException ex) {
Logger.getLogger(App_Gui.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Zapravo gotov");
dialog.getContentPane().setBackground(jLabel2.getBackground());
dialog.setModal(true);
Assignment_Tajmer_Aplikacija.f.setVisible(false);
}
};
sw.execute();
private void jSlider1StateChanged(javax.swing.event.ChangeEvent evt) {
// TODO add your handling cosadde here:
jSlider1.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider) e.getSource();
//System.out.println(source.getValue());
}
});
}
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
JColorChooser jcc = new JColorChooser();
Color c = jcc.showDialog(null, "Choose background color", Color.yellow);
jLabel2.setForeground(c);
jLabel2.setBackground(c);
jLabel2.setText("Color: " + c.getRGB() + "(RGB)");
}
private void jCheckBox2ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
jCheckBox1.setSelected(false);
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
sw.cancel(true);
}
private void jCheckBox1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
jCheckBox2.setSelected(false);
}
你不能取消它,但你可以将它短路,以便它提前结束。在您的线程之间使用一些共享状态标志来发出信号。
用done()
开头的isCancelled()
方法,看要不要操作
我正在制作一个程序,它应该能够通过单击一个按钮来停止整个过程。
我已经使用sw.cancel(true);
这样做了,但是,SwingWorker
方法protected void done()
仍在运行。
我怎样才能按一下按钮取消整个事情?不只是 doInBackground()
方法?
对于感兴趣的人,下面是完整的相关代码:
sw = new SwingWorker() {
protected Object doInBackground() throws Exception {
//Pravljenje timera
t = new Timer(0, new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
//Provera stanja checkboxova
if(jCheckBox2.isSelected()) {
try {
int delay =(int) jSpinner2.getValue();
jCheckBox1.setSelected(false);
Thread.sleep(delay*60000);
} catch (InterruptedException ex) {
Logger.getLogger(App_Gui.class.getName()).log(Level.SEVERE, null, ex);
}
}
if(jCheckBox1.isSelected()) {
jCheckBox2.setSelected(false);
Date delay2 = (Date) jSpinner1.getValue();
userCal = Calendar.getInstance();
System.out.println("delay2: " + delay2);
userCal.setTime(delay2);
System.out.println("userCal:" + userCal);
Calendar sysCal = Calendar.getInstance();
System.out.println("sysCal: " + sysCal);
timerAtDate =
(((int) userCal.get(Calendar.HOUR_OF_DAY) - (int) sysCal.get(Calendar.HOUR_OF_DAY)) * 60 * 60 * 1000 +
((int) userCal.get(Calendar.MINUTE) - (int) sysCal.get(Calendar.MINUTE)) * 60 * 1000 +
((int) userCal.get(Calendar.SECOND) - (int) sysCal.get(Calendar.SECOND)) * 1000);
Thread.sleep(timerAtDate);
}
return null;
}
@Override
protected void done() {
System.out.println("Done!");
t.start();
t.setRepeats(false);
JDialog dialog = new JDialog();
dialog.setLocation(700, 300);
dialog.setSize(600, 400);
dialog.setVisible(true);
try {
Thread.sleep(jSlider1.getValue());
} catch (InterruptedException ex) {
Logger.getLogger(App_Gui.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Zapravo gotov");
dialog.getContentPane().setBackground(jLabel2.getBackground());
dialog.setModal(true);
Assignment_Tajmer_Aplikacija.f.setVisible(false);
}
};
sw.execute();
private void jSlider1StateChanged(javax.swing.event.ChangeEvent evt) {
// TODO add your handling cosadde here:
jSlider1.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider) e.getSource();
//System.out.println(source.getValue());
}
});
}
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
JColorChooser jcc = new JColorChooser();
Color c = jcc.showDialog(null, "Choose background color", Color.yellow);
jLabel2.setForeground(c);
jLabel2.setBackground(c);
jLabel2.setText("Color: " + c.getRGB() + "(RGB)");
}
private void jCheckBox2ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
jCheckBox1.setSelected(false);
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
sw.cancel(true);
}
private void jCheckBox1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
jCheckBox2.setSelected(false);
}
你不能取消它,但你可以将它短路,以便它提前结束。在您的线程之间使用一些共享状态标志来发出信号。
用done()
开头的isCancelled()
方法,看要不要操作