捕获的图像不会被java程序检测到

时间:2015-04-22 20:10:38

标签: java swing events jpanel actionlistener

在我的java程序中,我正在创建一个GUI,它可以在点击JPanel时在JButton中显示捕获的图像。

下面是我创建的自定义ImagePanel类,用于渲染捕获的图像。

public class ImagePanel extends JPanel {
    private static final long serialVersionUID = 1L;
    private BufferedImage image;

    public ImagePanel() {
        try {
            File f = new File("capture.jpg");
            f.exists();  //this is returning false here, don't no why ?
            image = ImageIO.read(f); 
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
    }
}

点击JButton,在ActionListener中,我正在执行以下操作

@Override
    public void actionPerformed(ActionEvent e) {
        String s = e.getActionCommand();
        System.out.println(s);
        if (s.equals("Capture Image")) {
            //Here calling a script to capture the image.
            try {
                Process proc = Runtime.getRuntime().exec("./capture.sh");
                Thread.sleep(2000);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            ImagePanel  panel = new ImagePanel();
            containerPanel.add(panel);
            containerPanel.revalidate();
            containerPanel.repaint();
            .....

但是,我的程序无法检测到捕获的图像并显示它。但是,当我下次单击JButton时,它会显示先前捕获的图像。

即使经过很多喧嚣,也无法发现问题。任何帮助赞赏。 谢谢!

2 个答案:

答案 0 :(得分:3)

你说:

ILoveCats

这可能是假的,因为你的路径是错误的。请记住,使用Files时,路径相对于user.dir路径。要查看用户目录是什么,只需打印出来:

$(document).ready(function(){

  $('.linha').each(function(){  
  if ($(this).val() == ''){
    //Call Your fill input function $(this) as parameter
  }

  });
});

最好使用资源而不是文件......

File f = new File(capture.jpg); // ****this compiles without quotes?????
f.exists();  //this is returning false
image = ImageIO.read(f);

使用资源时,路径将相对于类路径 - 类文件的位置,而不是用户目录。

答案 1 :(得分:1)

以下是使用图像不断更新JLabel的示例:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;
import javax.imageio.*;
import javax.swing.*;
import java.net.*;

public class ImageReload extends JPanel implements ActionListener
{
    JLabel timeLabel;
    JLabel imageLabel;
    ImageIcon icon = new ImageIcon("timeLabel.jpg");

    public ImageReload()
    {
        setLayout( new BorderLayout() );

        timeLabel = new JLabel( new Date().toString() );
        imageLabel = new JLabel( timeLabel.getText() );

        add(timeLabel, BorderLayout.NORTH);
        add(imageLabel, BorderLayout.SOUTH);

        javax.swing.Timer timer = new javax.swing.Timer(1000, this);
        timer.start();
    }

    public void actionPerformed(ActionEvent e)
    {
        timeLabel.setText( new Date().toString() );

        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    String imageName = "timeLabel.jpg";
                    BufferedImage image = ScreenImage.createImage(timeLabel);
                    ScreenImage.writeImage(image, imageName);

                    InputStream iStream = getClass().getResourceAsStream(imageName);
                    imageLabel.setIcon( new ImageIcon(ImageIO.read( iStream ) ) );

                }
                catch(Exception e)
                {
                    System.out.println( e );
                }
            }
        });
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new ImageReload() );
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

此示例还需要使用Screen Image类。

编辑:

  

显示先前捕获的图像。

所以我猜测问题是你的代码在写入图像之前正在执行。我对你的相机应用程序一无所知。

也许您可以使用Process.waitFor()方法等待该过程完成。

或许你应该使用`SwingWorker。