如何使复选框执行连续任务,直到取消选中?



>有人知道如何让复选框执行任务直到它被取消选中吗?

JCheckBox chckbxInspecAuto = new JCheckBox("Inspe. Auto.");
chckbxInspecAuto.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0)
{
try {
gimage = vision.grab();
cvSaveImage("image001.bmp", gimage);
ipanel.loadImage("image001.bmp");

} catch (com.googlecode.javacv.FrameGrabber.Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} 

}
});

编辑:代码现在在那里...

您可以扩展 SwingWorker 类甚至 Thread 来实现您希望复选框控制的功能。创建方法contiueWorking()stopWorking(),并在 run 方法中检查一些布尔标志以查看是执行任务还是睡眠。 正如 Robin 在下面的一篇文章中评论的那样,摆动组件只能从事件工作线程访问。我在下面的示例中违反了此规则,因为我想生成一些简单的东西,并且由于正在运行的线程大部分时间都处于睡眠状态,因此它工作正常。

我会使用 SwingWorker 来完成一个更耗时的任务,我希望在执行时更新用户。例如,假设我们有一个线程生成,然后发送一组电子邮件,对于每封电子邮件,在 UI 中显示一些文本,以确认消息已发送或指示无法送达的原因。每条消息可能会将线程锁定一段时间。UI 不会与线程执行电子邮件任务同步更新。摇摆工人来救援。 java2s.com 网站有一个SwingWokerDemo。

import java.awt.BorderLayout;
import javax.swing.*;
import java.awt.event.*;
import java.util.ArrayList;
/**
*  The sequence of prime integers is calculated and displayed on the screen.
*  This little program demonstrates how a checkbox can be used
*  to start and stop a thread. 
*/
public class ThreadDemo extends JFrame {
JCheckBox runningCB;
JTextArea displayArea;
JTextField delayField;
PrimeCalcThread workerThread = null;
public ThreadDemo() {
super("Prime Numbers");
runningCB = new JCheckBox("Calculate Primes");
JPanel topPanel = new JPanel();
topPanel.add(runningCB);
topPanel.add(new JLabel("Dealy: "));
delayField = new JTextField(10);
delayField.setText("500");
topPanel.add(delayField);
getContentPane().add(topPanel,BorderLayout.NORTH);
displayArea = new JTextArea(30,80);
displayArea.setText("2, 3, 5, ");
displayArea.setLineWrap(true);
JScrollPane scroller = new JScrollPane(displayArea);
getContentPane().add(scroller,BorderLayout.CENTER);
pack();
runningCB.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(runningCB.isSelected() ) {
if(workerThread != null)
workerThread.contiueWorking();
else {
workerThread = new PrimeCalcThread();
workerThread.start();
}
}
else {
if(workerThread != null)
workerThread.stopWorking(); 
}
}
});
delayField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String input = delayField.getText().trim();
try {
int d = Integer.parseInt(input);
workerThread.setDelay(d);
}
catch(NumberFormatException nfe) { }
}
});
setVisible(true);
}
public static void main(String[] arg) {
ThreadDemo window = new ThreadDemo();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* When this thread is active it calculates prime numbers. The Thread 
* continues until it is paused with stopWorking() or until the 
* boolean field endThread is set to true.
*/
class PrimeCalcThread extends Thread {
ArrayList<Integer> primeList;
int delay = 500;
boolean active = true;
boolean endThread = false;
private int lastPrime;
public PrimeCalcThread() {
primeList = new ArrayList<> (1024);
primeList.add(2); primeList.add(3); primeList.add(5);
lastPrime=5;
}
public void run() {
while(!endThread) {
if(active) {
calcNextPrime();
displayArea.append(lastPrime + ", ");
}
try { sleep(delay);  }
catch(InterruptedException whatever) { }
}
}
private void calcNextPrime() {
int p = lastPrime+2;
while(!isPrime(p))
p+=2;
primeList.add(p);
lastPrime = p;
}
/**
* Checks if p is prime by checking for divisibility by all primes in the
* calculated primeList so far. This method only works if sqrt(p) < lastPrime
*/
private boolean isPrime(int p) {
int maxCheck = (int) Math.sqrt(p) + 1;
for(int prime: primeList) {
if(p % prime == 0)
return false;
if(prime > maxCheck)
break;
}
return true;
}
public int getLastPrime() {
return lastPrime;
}
public ArrayList<Integer> getPrimeList() {
return primeList;
}
public int getDelay() {
return delay;
}
public void setDelay(int waitTime) {
if(waitTime>=0)
delay = waitTime;
}
public void contiueWorking() {
active=true;
}
public void stopWorking() {
active=false;
}
}
}

-创建一个守护进程线程并在无限循环中运行它,让它继续检查是否使用isSelected()方法或ItemListener检查 JCheckBox 。

-JCheckBox被选中时,创建一个线程来执行任务,或使用正确同步 UI 和非 UI线程工作的SwingWorker Class

这取决于任务。

如果任务在其他计算机上的其他进程上,您可以简单地发送正确的消息。 如果任务是同一应用程序中的单独线程,您可以按照 wxyz 的建议进行操作,或者您可以使用某种能够启动和停止线程的侦听器(线程始终相同,或者您每次选中复选框时都会创建一个新线程?

我最喜欢的一种是以"PUSH"方式使用观察者模式,因此您将使用某种外部信号到线程,该信号在发送时将创建和/或停止它。

最新更新