2011-06-13 4 views
0

Je l'ai fait avec succès auparavant, mais maintenant après avoir exécuté le programme de nombreuses fois l'échec vient à la capture d'écran est trop rapide. Et il ne prendra pas l'image correcte, il le prend que le jframe est en train de disparaître. Comment puis-je résoudre ce problème?ErrorComment capturer une image à partir d'une jfame? (Trop rapide)

Edit: Donc, fondamentalement, je suis en train de capturer l'image des JPanels à l'intérieur du JFrame, mais dans le processus de le faire en l'appelant sur l'image d'une macro Excel capturée se révèle être celui ci-dessus au lieu de l'image dont j'ai besoin.

import java.io.*; 
import javax.swing.*; 
import java.awt.event.*; 
import javax.imageio.ImageIO; 
import java.awt.image.BufferedImage; 
public class TimeTableGraphicsRunner extends JFrame 
{ 
    public TimeTableGraphicsRunner() 
    { 
     getContentPane().setLayout(new BoxLayout(getContentPane(),BoxLayout.Y_AXIS)); 
    } 
    public void load(TimeTablePanel pan) 
    { 
     pan.setTitle(x.getTitle(TimeTable.titleCount)); 
     getContentPane().add(pan); 
    } 
    public void run()throws Exception 
    { 
     System.out.println("Creating image in panel"); 
     //setSize(TimeTable.width,TimeTable.height); 
     getContentPane().setPreferredSize(new java.awt.Dimension(TimeTable.width,TimeTable.height)); 
     pack(); 
     setVisible(true); 
     System.out.println("Image is in panel"); 
     grabScreenShot(); 
     System.out.println("Cleaning up"); 
     setVisible(false); 
     System.out.println("Finished"); 
     System.exit(0); 
    } 
    private void grabScreenShot() throws Exception 
    { 
     BufferedImage image = (BufferedImage)createImage(getContentPane().getSize().width,getContentPane().getSize().height); 
     getContentPane().paint(image.getGraphics()); 
     try{ 
      ImageIO.write(image, "png", new File("C:\\Users\\"+TimeTable.user+"\\AppData\\TimeLineMacroProgram\\TimeLine.png")); 
      System.out.println("Image was created"); 
     } 
     catch (IOException e){ 
      System.out.println("Had trouble writing the image."); 
      throw e; 
     } 
    } 
} 
+1

huh? est-ce que vous avez soin d'élaborer ou de fournir du code? au fait, à quoi sert la capture d'écran? – mre

+0

Si la capture d'écran est trop rapide pourquoi ne pas dormir (1000) dans le sujet avec lequel vous prenez des captures d'écran? Aussi, avez-vous regardé 'java.awt.Robot'? –

+0

['SwingUtilities.invokeAndWait (...)'] (http://download.oracle.com/javase/6/docs/api/javax/swing/SwingUtilities.html#invokeAndWait%28java.lang.Runnable%29) Cela peut s'avérer utile, mais nous avons vraiment besoin d'une élaboration, sinon nous resterons tous dans le noir. – mre

Répondre

1

Il faut du temps au système d'exploitation pour construire et afficher la trame. Ainsi, l'action de capture d'écran est en cours d'exécution avant que la trame puisse être entièrement affichée.

Vous pouvez contourner le problème de plusieurs façons. Le mieux est probablement d'utiliser un ComponentListener.

public class TimeTableGraphicsRunner extends JFrame implements ComponentListener 
{ 
    public TimeTableGraphicsRunner() 
    { 
     addComponentListener(this); 
     ... snip 
    } 

    ... snip 

    public void componentShown(ComponentEvent e) { 
     grabScreenShot(); 
     System.out.println("Cleaning up"); 
     setVisible(false); 
     System.out.println("Finished"); 
     System.exit(0); 
    } 
} 
Questions connexes