Java 将从网络摄像头获取的图像添加到现有JPanel

Java 将从网络摄像头获取的图像添加到现有JPanel,java,swing,opencv,webcam,javacv,Java,Swing,Opencv,Webcam,Javacv,当点击按钮时,我试图将从网络摄像头捕获的图像添加到现有的JPanel中,但JPanel从未显示该图像。谁能给我指一下正确的方向吗 private void captureButtonActionPerformed(java.awt.event.ActionEvent evt) { BufferedImage img1; JLabel label; final OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);

当点击按钮时,我试图将从网络摄像头捕获的图像添加到现有的JPanel中,但JPanel从未显示该图像。谁能给我指一下正确的方向吗

private void captureButtonActionPerformed(java.awt.event.ActionEvent evt) {
    BufferedImage img1;
    JLabel label;
    final OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);

    try {
        grabber.start();
        IplImage img = grabber.grab();
        if (img != null) {

            img1 = img.getBufferedImage();
            ImageIcon icon = new ImageIcon(img1);
            label = new JLabel(icon);
            //photo is the name of the JPanel
            photo.add(label);
            photo.setVisible(true);
            grabber.stop();
            System.out.println("done");

        }

    } catch (Exception e) {
        e.printStackTrace();
    }
编辑:这是整个班级。(为了便于阅读,对其进行了修剪)

package荣誉项目;
导入com.googlecode.javacv.OpenCVFrameGrabber;
导入com.googlecode.javacv.cpp.opencv_core.IplImage;
导入java.awt.image.buffereImage;
导入javax.swing.ImageIcon;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
公共类AddPerson扩展了javax.swing.JFrame{
/**创建新表单AddPerson*/
公众人物(){
初始化组件();
}
@抑制警告(“未选中”)
// 
私有组件(){
jLabel1=newjavax.swing.JLabel();
jSeparator1=newjavax.swing.jsepator();
jLabel2=newjavax.swing.JLabel();
jLabel3=newjavax.swing.JLabel();
nameField=newjavax.swing.JTextField();
姓氏字段=newjavax.swing.JTextField();
photo=newjavax.swing.JPanel();
captureButton=newjavax.swing.JButton();
saveButton=newjavax.swing.JButton();
cancelButton=newjavax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setboorder(javax.swing.BorderFactory.createLineBorder(newjava.awt.Color(0,0,0));
包装();
}// 
private void captureButtonActionPerformed(java.awt.event.ActionEvent evt){
缓冲图像img1;
JLabel标签;
最终OpenCVFrameGrabber抓取器=新OpenCVFrameGrabber(0);
JFrame=新JFrame();
试一试{
grabber.start();
IplImage img=grabber.grab();
如果(img!=null){
img1=img.getBuffereImage();
ImageIcon图标=新的ImageIcon(img1);
标签=新的JLabel(图标);
//photo是JPanel的名称
照片。添加(标签);
照片。设置可见(真实);
抓取器。停止();
系统输出打印项次(“完成”);
抓取器。停止();
系统输出打印项次(“完成”);
}
}捕获(例外e){
e、 printStackTrace();
}
}                                             
公共静态void main(字符串参数[]){
invokeLater(new Runnable()){
公开募捐{
new AddPerson().setVisible(true);
}
});
}
//变量声明-不修改
私有javax.swing.JButton取消按钮;
私有javax.swing.JButton captureButton;
私有javax.swing.JLabel jLabel1;
私有javax.swing.JLabel jLabel2;
私有javax.swing.JLabel jLabel3;
私有javax.swing.jsepator jSeparator1;
私有javax.swing.JTextField nameField;
私有javax.swing.JPanel照片;
私有javax.swing.JButton saveButton;
私有javax.swing.JTextField;
//变量结束声明

}

如果要将新组件添加到
照片中
JPanel
,则需要更新并绘制容器:

photo.revalidate();
photo.repaint();
或者,也可以在启动时添加
JLabel
,允许您调用以更新映像

更新:

您似乎没有将
JPanel
photo
添加到
JFrame
的任何位置:

add(photo);


不要创建另一个
JFrame
来显示图像。使用原始的
JFrame
将其添加到您的
JPanel
。请参阅。

如果要将新组件添加到
照片中
JPanel
,则需要更新并绘制容器:

photo.revalidate();
photo.repaint();
或者,也可以在启动时添加
JLabel
,允许您调用以更新映像

更新:

您似乎没有将
JPanel
photo
添加到
JFrame
的任何位置:

add(photo);


不要创建另一个
JFrame
来显示图像。使用原始的
JFrame
将其添加到您的
JPanel
。请参阅。

我通过使用JLabel而不是JFrame或JPanel解决了这个问题,它工作了。

我通过使用JLabel而不是JFrame或JPanel解决了这个问题,它工作了。

您忘记调用
设置图标了。

label.setIcon(icon);

您忘记调用设置图标了:

label.setIcon(icon);


有例外吗?您是否已经打印了图标等以查看其值?没有例外,程序完成时没有错误,并且“完成”已打印出来。您是否使用布局管理器?您需要一次添加多个图像吗?我正在使用布局管理器,但不需要,我只需要单击一个按钮即可添加一个图像。要更快获得更好的帮助,请发布一个。要做到这一点,请排除所有网络摄像头的复杂因素,只需使用
new BufferedImage(40,40,BufferedImage.TYPE\u INT\u RGB)
在代码中生成一个图像。请参阅显示图像的SSCCE的示例。有例外情况吗?您是否已经打印了图标等以查看其值?没有例外,程序完成时没有错误,并且“完成”已打印出来。您是否使用布局管理器?您需要一次添加多个图像吗?我正在使用布局管理器,但不需要,我只需要单击一个按钮即可添加一个图像。要更快获得更好的帮助,请发布一个。要做到这一点,请排除所有网络摄像头的复杂因素,只需使用
new BufferedImage(40,40,BufferedImage.TYPE\u INT\u RGB)
在代码中生成一个图像。请参阅显示图像的SSCE。您是否调用了
revalidate
?@davy307可能是图像不包含数据或
JPanel
没有大小。考虑张贴一个@ MkObEL,我也尝试了标签。SeTiCon,它不起作用,除了Nabel=新JLable(图标)做的一样吗?@ Reimeus,图像确实包含数据,当我使用JFrrar时,这是完美的,但是因为要创建的GUI IM的类型,我需要嵌入在JFrAMP中的JPAND中的图像。