在我的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时,它会显示先前捕获的图像。
即使经过很多喧嚣,也无法发现问题。任何帮助赞赏。 谢谢!
答案 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。