我试图在单击按钮时将从网络摄像头捕获的图像添加到现有的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 honoursproject;
import com.googlecode.javacv.OpenCVFrameGrabber;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class AddPerson extends javax.swing.JFrame {
/** Creates new form AddPerson */
public AddPerson() {
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jSeparator1 = new javax.swing.JSeparator();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
nameField = new javax.swing.JTextField();
surnameField = new javax.swing.JTextField();
photo = new javax.swing.JPanel();
captureButton = new javax.swing.JButton();
saveButton = new javax.swing.JButton();
cancelButton = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
photo.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
pack();
}// </editor-fold>
private void captureButtonActionPerformed(java.awt.event.ActionEvent evt) {
BufferedImage img1;
JLabel label;
final OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
JFrame frame = new JFrame();
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");
grabber.stop();
System.out.println("done");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new AddPerson().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton cancelButton;
private javax.swing.JButton captureButton;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JTextField nameField;
private javax.swing.JPanel photo;
private javax.swing.JButton saveButton;
private javax.swing.JTextField surnameField;
// End of variables declaration
}
如果你要添加一个新组件到你的photo
JPanel
,你将需要更新&绘制容器:
photo.revalidate();
photo.repaint();
或者,也可以在启动时添加JLabel
,允许您调用setIcon来更新映像。
更新:
您似乎没有将您的JPanel
photo
添加到您的JFrame
:
add(photo);
不要创建另一个JFrame
来显示您的图像。使用原始的JFrame
将其添加到JPanel
中。
我通过使用JLabel而不是JFrame或JPanel解决了这个问题,并且它可以工作。
您忘记调用setIcon
:
label.setIcon(icon);