2016-08-09 32 views
2

Ich muss einen Screenshot von einem Bereich meines Bildschirms machen, damit ich "Robot" in Java benutze. Aber wenn der Benutzer die Fenster in dem Bereich platziert, werden die Fenster auf dem Screenshot statt dem Hintergrund angezeigt.Wie mache ich eine Aktion nur, wenn mein Frame auf dem Bildschirm in Java verschwindet?

Ich habe versucht, mein Problem zu lösen, indem ein Abdrucken:

myframe.setVisible(false); 

Aber wenn ich den Screenshot sehen die Fenster erscheinen auf sie. Ich dachte, es war, weil die Fenster nicht genug Zeit oder zu verschwinden hatte, weil der Rand des Bildschirms machen noch nicht aktualisiert wurde, so habe ich versucht, verschiedene Dinge wie mit:

repaint(); 

oder durch eine

platzieren
try{}finally{} 

Block, um sicherzustellen, dass die Aktionen im try-Block abgeschlossen wurden. Aber keine dieser Lösungen funktioniert. Dies sind andere Wege in meinem Kopf, aber sie sehen global schlecht aus, weil sie Funktionen verwenden, um zu warten.

Also gibt es eine gute Lösung für mein Problem?

+0

Um eine bessere und schnellere Hilfe zu erhalten, bieten Sie [MCVE] – STaefi

+0

versuchen Sie, eine Bildschirmaufnahme in Java zu machen? – aurelianr

+0

Nein, ich möchte nur den Screenshot machen, wenn der Frame verschwunden ist, wenn ich versuche, den Frame unsichtbar zu machen und dann meinen Screenshot zu machen, erscheint mein Frame auf dem Screenshot. – Firetiger72

Antwort

0

Verwenden Sie SwingUtilities.invokeLater(), um den tatsächlichen Screenshot zu erstellen. Nicht 100% sicher, aber ich denke, dass myframe.setVisible(false); nicht wirksam wird, bis der Programmablauf zurück in die Event-Dispatching-Schleife geht.

EDIT: statt

useRobotToMakeScreenshot(); 

Schreib

javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      useRobotToMakeScreenshot(); 
     } 
    } 

(natürlich haben Sie useRobotToMakeScreenshot() mit dem eigentlichen Aufruf der Methode zu ersetzen, die screenshooting Sache tut)

+0

Können Sie bitte genauer sein, ich habe nicht sehr viel verstanden Ihre Antwort und es scheint, dass es, was ich suche ... – Firetiger72

+0

@ Firetiger72 schauen Sie auf meine erweiterte Antwort, hoffe es hilft –

1

Sie können den Fenster-Listener verwenden, um den Bildschirm abzuschießen, wenn das Fenster geschlossen wird:

import java.awt.event.WindowEvent; 
import java.awt.event.WindowListener; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class MainFrame extends JFrame implements WindowListener { 

    public MainFrame() { 

     super("Test Frame"); 
     JLabel displayMsg = new JLabel(" Close window"); 
     getContentPane().add(displayMsg); 

     addWindowListener(this); 
     setSize(400, 300); 
     setVisible(true); 

    } 

    @Override 
    public void windowClosing(WindowEvent e) { 

     System.out.println("WindowListener method called: windowClosing."); 
     //add you screen capture code here 
    } 

    //--Not used 

    @Override 
    public void windowClosed(WindowEvent e) { 
     //do nothing 
    } 

    @Override 
    public void windowOpened(WindowEvent e) { 
     //do nothing 
    } 

    @Override 
    public void windowIconified(WindowEvent e) { 
     //do nothing 
    } 

    @Override 
    public void windowDeiconified(WindowEvent e) { 
     //do nothing 
    } 

    @Override 
    public void windowActivated(WindowEvent e) { 
     //do nothing 
    } 

    @Override 
    public void windowDeactivated(WindowEvent e) { 
     //do nothing 
    } 

    public void windowGainedFocus(WindowEvent e) { 
     //do nothing 
    } 

    public void windowLostFocus(WindowEvent e) { 
     //do nothing 
    } 

    public static void main(String[] args) { 
     new MainFrame(); 
    } 
}