Problem mit 'Flackern'

C

Chantal

Hallo,
nutze Win7 x64 und erzeuge ein JWindow, darin ist ein Screenshot von 50*50 als Hintergrund. Darüber lege ich ein Fadenkreuz. Alle paar Starts (bitte öfters versuchen) flackert das JWindow kurz ganz in schwarz oder auch mal in grau und stellt dann erst das Fadenkreuz dar.
Extrem wird es, wenn ich die Variablen z.B. 700*700 setze.

Wie lässt sich das abstellen?

Java:
import java.awt.AWTEvent;
import java.awt.AWTException; 
import java.awt.AlphaComposite; 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension; 
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D; 
import java.awt.GraphicsEnvironment; 
import java.awt.Image;
import java.awt.KeyboardFocusManager;
import java.awt.MediaTracker;
import java.awt.Point;
import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.Toolkit;
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage; 
import java.io.File;
import java.io.IOException; 
import java.util.Date;
import java.util.Hashtable;
import java.util.TimerTask;

import javax.imageio.ImageIO; 
import javax.swing.JDialog;
import javax.swing.JFrame; 
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow; 
import javax.swing.SwingUtilities; 
import java.awt.BasicStroke;
import java.awt.RenderingHints;


public class Crosshair extends JWindow{

	private Image img;
	private int width,height;

	public Crosshair(){
    
		this.width = 50;
		this.height = 50;
		setSize(width,height);

		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        setLocationRelativeTo(null); 
		
		MediaTracker mt = new MediaTracker(this);
		GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
        final int x=(int)((int)ge.getMaximumWindowBounds().getWidth()/2-this.width/2); 
        final int y=(int)((int)ge.getMaximumWindowBounds().getHeight()/2-this.height/2); 
        final int w=this.width; 
        final int h=this.height; 
        Robot robot=null;
    		try {
    			robot=new Robot();
    		}catch(AWTException e){} 
            final Rectangle rectangle=new Rectangle(x,y,w,h); 
            img=robot.createScreenCapture(rectangle); 
    
    		setVisible(true);
    
    		if (img == null){
    			img = this.createImage(x, y);
    		}
    		
    		mt.addImage(img, 0);
    
    		try {
    			mt.waitForAll();
    		} catch (InterruptedException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
    		
    		try{
        	Thread.sleep(3000);
        }catch(Exception e){
          System.err.println(e.toString());
        }
        finally{
        	System.exit(0);
        }
		
	}

	public static void main(String[] args) {
		Crosshair screen=new Crosshair();
	}

	public void paint(Graphics g) {
		super.paint(g);
		if(img != null){
          g.drawImage(img, 0, 0, this);
	        Graphics2D g2d=(Graphics2D)g;   
	        g2d.drawImage(img,0,0,null); 
	        int width,height;
	        width=getWidth();
	        height=getHeight();
	        g2d.translate(width/2,height/2);
	        for (int i=0;i<4;i++){
	            g2d.rotate(Math.PI/2f);
	            g2d.drawLine(0,-10,0,-20);
	        }
		  }
	}

}
 
Ok, das Double Buffering kanns nicht sein, wenn ich ein JPanel als Container nehme, da ist das standardmäßig gesetzt, funktioniert es auch bestens, das Flackern bleibt.

Habe die Applikation mal auf einer Win32 XP laufen lassen, kann dieses Flackern beim Starten NICHT provozieren. Mmmmh. Liegt vielleicht am Win7 (Grafiktreiber ist aber ok)?

Hat da jemand Erfahrung mit?
 
Wenn ich Win7-Aero deaktiviere, funktioniert es so wie es soll, selbst nach zigfachen Versuchen kein Flackern. Ich habe
java version "1.6.0_16"
Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) 64-Bit Server VM (build 14.2-b01, mixed mode)

Kann man da irgendwas verbessern?
 
Zurück