在循环中更新图像而不影响其他框架的工作

时间:2015-11-28 11:43:38

标签: java multithreading swing webcam

我正在研究一个项目,我需要从相机中读取条形码。我能够捕获图像并解码它们,但只剩下问题是我需要捕获并解码它们。进程工作直到用户停止它。 所以我能做到的就是这个

btnCapture = new JButton("Capture");
    btnCapture.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            // camera is already initialized and ready to use
            // take image from webcam
            image = webcam.getImage();

            // convert the image to show it on a label
            lblNewLabel.setIcon((imageCont.convertToImageIcon(image,lblNewLabel)));

        }
    });
    btnCapture.setBounds(508, 151, 89, 23);
    add(btnCapture);

这个过程工作正常,但我需要它不是一次工作,而是当用户按btnCapture时我不停地工作

            while(true)
            {
                // camera is already initialized and ready to use
                // take image from webcam
                image = webcam.getImage();

                // convert the image to show it on a label
                lblNewLabel.setIcon((imageCont.convertToImageIcon(image,lblNewLabel)));
            }

当我尝试这个时,这会冻结用户界面。请帮助我,我研究了它,并得到了一个线程的想法,但我无法做到。

1 个答案:

答案 0 :(得分:1)

  1. 为此目的,不要将一个MouseListener添加到JButton,因为错误的侦听器的使用将导致错误行为,例如即使禁用该按钮仍然可以正常工作。
  2. 使用ActionListener。
  3. 对于重复的操作,请使用SwingWorker,并在SwingWorker的doInBackground方法中执行长时间运行的代码while循环。这将在后台线程中运行此代码,并防止它冻结Swing事件线程。
  4. 您可以使用SwingWorker的发布/处理方法对在SwingWorker仍在运行时将完成的图像或结果从图像传回GUI。
  5. 有关详情,请阅读Lesson: Concurrency in Swing