2017-04-04 1 views
-2

Ich habe dieses Webcam-Programm, das in einem JFrame ausgeführt wird. Immer wenn ich den Rahmen schließe, wird "Closed" wie gewünscht ausgedruckt, aber meine IDE sagt, dass sie noch läuft. Warum ist das und wie repariere ich es? Ich führe keine Threads irgendwo im Programm. Dies hat nichts mit der Standard-Schließen-Operation zu tun, wie ich es bereits getestet habe.Warum schließt dieses Java-Programm beim Beenden nicht?

public class Webcam extends JPanel { 

private static BufferedImage image; 

public Webcam() { 
    super(); 
} 

public static void main(String args[]) { 
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 

    JFrame frame = new JFrame("Webcam"); 
    Webcam panel = new Webcam(); 

    // Initialize JPanel parameters 
    //frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    frame.setSize(1080, 720); 
    frame.setContentPane(panel); 
    frame.setVisible(true); 
    frame.addWindowListener(new WindowAdapter() 
    { 
    @Override 
    public void windowClosing(WindowEvent e) 
    { 
     System.out.println("Closed"); 
     e.getWindow().dispose(); 
     System.exit(0); 
    } 
    }); 
    Mat currentImage = new Mat(); 

    VideoCapture capture = new VideoCapture(0); 
    if(capture.isOpened()) { 
    // Infinitely update the images 
    while(true) { 
     // VideoCapture returns current Mat 
     capture.read(currentImage); 
     if(!currentImage.empty()) { 
      frame.setSize(currentImage.width() + 40, currentImage.height() + 60); 
      image = panel.matrixToBuffer(currentImage); 
      // Update the panel 
      panel.repaint(); 
     } 
     else { 
      System.out.println("Error: no frame captured"); 
      frame.dispose(); 
      System.exit(0); 
      break; 
     } 
    } 
    } 
    return; 

}

+5

Mögliches Duplikat von [JFrame Exit on close Java] (http://stackoverflow.com/questions/7799940/jframe-exit-on-close-java) – nhouser9

+0

Der Hauptgrund dafür ist, dass immer noch ein Nicht-Daemon-Thread läuft . Sie können einen Blick auf ['JFrame # setDefaultCloseOperation'] (https://docs.oracle.com/javase/8/docs/api/javax/swing/JFrame.html#setDefaultCloseOperation-int-) werfen und' EXIT_ON_CLOSE 'übergeben ', aber ich würde einen Blick darauf werfen, ob Sie herausfinden können, warum es noch einen laufenden Thread gibt – MadProgrammer

+0

Kann nicht reproduzieren. Nach dem Strippen 'Mat currentImage = new Mat();' und was auch immer dahinter steht, kann ich es in meiner IDEA und Eclipse starten, aber das Schließen des Rahmens mit der Taste x beendet das Programm. – glee8e

Antwort

0

Okay, während ich all die hilfreichen Kommentare zu schätzen wissen, war das Problem, dass die Videocapture ein Innengewinde Laufen hatte, und das Hinzufügen von capture.release() meiner Zuhörer es fixiert.

Verwandte Themen