java - Repaint 不调用 PaintComponent

标签 java swing

我正在尝试用 Java 创建一个 WebCam 示例,但它不起作用。 JPanel 的 Repaint 方法不会调用 paintComponent。当我在任何地方调用 repaint 时,它不会更新图像,但程序仍然继续运行:

这是我的例子:

public class JFrameExample extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private CameraPanel cameraPanel;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    JFrameExample frame = new JFrameExample();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public JFrameExample() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(300, 200, 900, 600);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        cameraPanel = new CameraPanel();
        cameraPanel.setBackground(Color.RED);
        cameraPanel.setBounds(10, 52, 640, 480);
        contentPane.add(cameraPanel);

        JButton btnActivar = new JButton("Activar");
        btnActivar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

                startCamera();
            }
        });
        btnActivar.setBounds(10, 11, 89, 23);
        contentPane.add(btnActivar);
    }

    private void startCamera(){

        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        VideoCapture eyeCamera = new VideoCapture(0);

        if(eyeCamera.isOpened()){
            while(true){
                Mat frame = new Mat();
                eyeCamera.read(frame);
                cameraPanel.setimage(matToBufferedImage(frame));
                cameraPanel.setSize(new Dimension(frame.width(),frame.height()));
                contentPane.repaint();
                cameraPanel.repaint();
                this.repaint();
            }
        }
    }

    public static BufferedImage matToBufferedImage(Mat matrix) {
        int cols = matrix.cols();
        int rows = matrix.rows();
        int elemSize = (int) matrix.elemSize();
        byte[] data = new byte[cols * rows * elemSize];
        int type;
        matrix.get(0, 0, data);
        switch (matrix.channels()) {
        case 1:
            type = BufferedImage.TYPE_BYTE_GRAY;
            break;
        case 3:
            type = BufferedImage.TYPE_3BYTE_BGR;
            // bgr to rgb
            byte b;
            for (int i = 0; i < data.length; i = i + 3) {
                b = data[i];
                data[i] = data[i + 2];
                data[i + 2] = b;
            }
            break;
        default:
            return null;
        }
        BufferedImage image2 = new BufferedImage(cols, rows, type);
        image2.getRaster().setDataElements(0, 0, cols, rows, data);
        return image2;
    }
}

相机面板

public class CameraPanel extends JPanel{

private static final long serialVersionUID = 1L;
private BufferedImage image;

public CameraPanel() {
    super();
}

public BufferedImage getimage() {
    return image;
}

public void setimage(BufferedImage newimage) {
    image = newimage;
    System.out.println("setImage method");
}

@Override
protected void paintComponent(Graphics grafics) {
    System.out.println("paintComponent method");
    super.paintComponent(grafics);
    if(image != null)
        grafics.drawImage(image, 10, 10, 50, 50, this);
}
}

最佳答案

我无法尝试,因为您的应用程序无法运行。但也许在 Thread 中运行 while(true) {} 部分可以解决您的问题。

Thread paintThread = new Thread(new Runnable(){
    public void run() {
        while(true){
            Mat frame = new Mat();
            eyeCamera.read(frame);
            cameraPanel.setimage(matToBufferedImage(frame));
            cameraPanel.setSize(new Dimension(frame.width(),frame.height()));
            contentPane.repaint();
            cameraPanel.repaint();
            this.repaint();
        }
    }
}

paintThread.start();

关于java - Repaint 不调用 PaintComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36235904/

相关文章:

java - 如何在 spark streaming 中映射 kafka 主题名称和各自的记录

java - center 在 BorderLayout 中不是公共(public)的;无法从包外部访问

java - 如果找不到实体则为空对象

java - fireTableDataChanged 对 JTable 没有影响

java - 卡住 Java JComponent

java - 为什么 x == (x = y) 与 (x = y) == x 不一样?

java - 更改 JSpinner 中的日期

java - 调整 JLayeredPane 层的大小

Java:当没有焦点时,在第二个监视器中保持窗口全屏

Java反射获取给定类的数组类