2013-07-04 27 views
2

我來找你,因爲我有一個奇怪的問題,對此我沒有找到任何解決辦法...的Java /鞦韆/ WebcamCapture:當我禁用一個JLabel,另一形象出現

我建立一個應用程序使用攝像頭拍攝照片。

我使用WebcamCapture來做到這一點,並且我沒有遇到任何問題。

出現這種情況唯一的「奇怪」的事情是這樣的:

  • 我用一個JDialog中,我做的照片。在JFrame的父項中,我在JLabel中顯示這些照片。

  • 然後,我需要禁用這些JLabel,並通過調用禁用所有組件的方法來實現。奇怪的是,當我禁用JLabel時,JLabel顯示網絡攝像頭捕獲的最後一個圖像。不是最後的照片,而是最後拍攝的圖像。

看來BufferedImage(由WebcamPanel使用)是鏈接到問題。

這裏是SSCE:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.border.Border; 

import com.github.sarxos.webcam.Webcam; 
import com.github.sarxos.webcam.WebcamPanel; 

@SuppressWarnings("serial") 
public class CameraFrame extends JFrame implements ActionListener{ 

    public Webcam webcam; 
    Boolean enabled = true; 
    CameraFrame frame; 

    private JButton btnSaveVerso; 
    private JLabel lblVerso; 

    private JButton btnEnable; 
    private JButton btnQuit; 
    private JPanel mainPanel; 
    private WebcamPanel streamPanel; 

    public static void main(String[] args){ 
     CameraFrame frame = new CameraFrame(); 
     frame.setVisible(true); 
    } 

    public CameraFrame() { 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 
       setLocationRelativeTo(null); 
       setResizable(false); 
       setMinimumSize(new Dimension(800, 600)); 
       setPreferredSize(new Dimension(800,600)); 
       buildPanel(); 
       setContentPane(mainPanel); 
      } 
     }); 
    } 

    public void buildPanel() { 
     mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS)); 

     Border blackline = BorderFactory.createLineBorder(Color.black, 1, true); 

     webcam = Webcam.getDefault(); 
     webcam.open(); 

     streamPanel = new WebcamPanel(webcam); 
     streamPanel.setPreferredSize(new Dimension(webcam.getViewSize())); 
     streamPanel.setMaximumSize(new Dimension(webcam.getViewSize())); 

     btnSaveVerso = new JButton("Take pic"); 
     btnSaveVerso.setActionCommand("take"); 
     btnSaveVerso.addActionListener(this); 

     lblVerso = new JLabel("Here will be the pic taken by the camera"); 
     lblVerso.setBorder(blackline); 

     btnEnable = new JButton("Disable"); 
     btnEnable.setActionCommand("disable"); 
     btnEnable.addActionListener(this); 

     btnQuit = new JButton("Quit"); 
     btnQuit.setActionCommand("quit"); 
     btnQuit.addActionListener(this); 

     mainPanel.add(streamPanel); 
     mainPanel.add(btnSaveVerso); 
     mainPanel.add(lblVerso); 
     mainPanel.add(btnEnable); 
     mainPanel.add(btnQuit); 

    } 

    @Override 
    public void actionPerformed(final ActionEvent e) { 
     Thread newThread = new Thread(){ 
      public void run(){ 
       if(e.getActionCommand().equals("take")){ 
        ImageIcon icon = new ImageIcon(webcam.getImage().getScaledInstance(100, 150, Image.SCALE_SMOOTH)); 
        lblVerso.setIcon(new ImageIcon(icon.getImage())); 
        lblVerso.revalidate(); 
        lblVerso.repaint(); 
       } 
       else if(e.getActionCommand().equals("disable")){ 
        if(enabled){ 
         lblVerso.setEnabled(false); 
         enabled = false; 
         btnEnable.setText("Enable"); 
        } 
        else{ 
         lblVerso.setEnabled(true); 
         enabled = true; 
         btnEnable.setText("Disable"); 
        } 
       } 
      } 
     }; 
     newThread.run(); 
     if(e.getActionCommand().equals("quit")){ 
      webcam.close(); 
      this.setVisible(false); 
     } 
    } 
} 

我希望你能編譯它沒有問題。不要忘記鏈接librairies

在此先感謝

+0

爲了更好地提供幫助,請發佈[SSCCE](http://sscce.org/)。 –

+0

它在哪裏?編輯中沒有鏈接。 –

+0

很可能不是:如果你需要壓縮它,很可能是你違反了_S_ :-) – kleopatra

回答

1

我終於解決了這個問題:你只需要關閉每個圖片後,網絡攝像頭,如下所示:

BufferedImage picture = webcam.getImage(); 
webcam.close(); 
webcam.open(); 

... Do what you need with picture 

(你甚至都不需要轉換的BufferedImage畫面中另一種類型)。

+0

+1發佈解決方案 - 很高興你發現它(生產sscce並不是太糟糕,是它:-) – kleopatra

+1

事實上。我正在做一個大項目,所以對我來說九個班是非常小的!感謝堅持。 –