1

チェックボックスがオフになるまでタスクを実行する方法を知っている人はいますか?

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();
            } 


        }
    });

編集:コードは今そこにあります...

4

3 に答える 3

2

SwingWorkerクラスまたはスレッドを拡張して、チェックボックスで制御する機能を実装できます。contiueWorking()メソッドを作成stopWorking()し、runメソッドでブールフラグをチェックして、タスクを実行するかスリープするかを確認します。ロビンが以下の投稿にコメントしたように、swingコンポーネントにはイベントワーカースレッドからのみアクセスする必要があります。以下の例では、単純なものを作成したかったため、このルールに違反しました。実行中のスレッドはほとんどの時間をスリープ状態に費やしているため、正常に動作します。

SwingWorkerを使用して、実行時にユーザーを更新したい、より時間のかかるタスクを実行します。たとえば、スレッドで一連の電子メールメッセージを生成して送信し、各電子メールについて、メッセージが送信されたことを確認したり、メッセージが配信されなかった理由を示すテキストをUIに表示するとします。各メッセージは、しばらくの間スレッドをロックする可能性があります。UIは、スレッドによる電子メールタスクの実行と同期して更新されません。SwingWorkerが救いの手を差し伸べます。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;
        }
    }
}
于 2012-11-09T13:44:47.913 に答える
0

タスクによって異なります。

タスクが他のマシンの他のプロセスにある場合は、適切なメッセージを送信するだけです。タスクが同じアプリケーション内の個別のスレッドである場合、wxyz が提案することを行うか、スレッドを開始および停止する機能を備えたある種のリスナーを使用できます (スレッドは常に同じであるか、毎回新しいスレッドを作成しています)。チェックボックスを選択しますか?)。

私のお気に入りは、「PUSH」の方法でオブザーバー パターンを使用することです。そのため、送信時にスレッドを作成および/または停止する何らかの外部信号をスレッドに使用します。

于 2012-11-09T12:56:11.697 に答える
0

-デーモンスレッドを作成して無限ループで実行し、 isSelected()メソッドまたはメソッドを使用して JCheckBox がチェックされているかどうかをチェックし続けますItemListener

-JCheckBox 選択されたら、スレッドを作成してタスクを実行するSwingWorker Class、UI スレッドと非 UI スレッドの作業を適切に同期するスレッドを使用します。

于 2012-11-09T12:51:01.847 に答える