Bonjour à tous,

Après avoir regardé les faq et autres infos sur le double buffering hardware ou software, je me retrouve en difficulté pour l'appliquer. Si l'un d'entre vous peux m'aiguiller sur la façon de faire

J'ai un jgoodie qui lance une petite animation de fading sur un Quit button mais je me retrouve avec cet effet que bcp d'entre vous on du surrement déjà avoir et c 'est vrai que c est tout moche tout moche!

Donc si quelqu'un peut jeter un coup d'oeil sur le code ci dessous et m'aiguiller pour réussir avec du double buffering Hard ou soft ca serrait cool merci!!

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
 
import java.awt.AlphaComposite;
import java.awt.Composite;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.image.BufferedImage;
 
import javax.swing.JComponent;
import javax.swing.JFrame;
 
public class Dissolver extends JComponent implements Runnable{
	Frame frame;
	Window fullscreen;
	int count;
	BufferedImage frame_buffer;
	BufferedImage screen_buffer;
	//2nd buffer
	Graphics buffer;
	Image image;
 
	public Dissolver(){}
 
	public void update(Graphics g){
	      paint(g);
	}
 
 
	public void dissolveExit(JFrame frame){
		try{
			this.frame = frame;
			Robot robot = new Robot();
 
			//cap screen w/ frame to frame buffer
			Rectangle frame_rect = frame.getBounds();
			frame_buffer = robot.createScreenCapture(frame_rect);
 
			//hide frame
			frame.setVisible(false);
 
			//cap screen w/o frame
			Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
			Rectangle screen_rect = new Rectangle(0,0,screensize.width, screensize.height);
			screen_buffer = robot.createScreenCapture(screen_rect);
 
			//create big window w/o decorations
			fullscreen = new Window(new JFrame());
			fullscreen.setSize(screensize);
			fullscreen.add(this);
			this.setSize(screensize);
			fullscreen.setVisible(true);
 
			//start animation
			new Thread(this).start();
		}catch(Exception e){
			System.out.println(""+e);
                  	}
	}
 
	public void run(){
		try{
			count = 0;
			Thread.sleep(100);
			for(int i=0; i<20; i++){
				count = i;
				fullscreen.repaint();
				Thread.sleep(100);
			}
			System.exit(0);
		}catch(Exception e){
			System.out.println(""+e);			System.exit(0);
		}
	}
 
 
	public void paint(Graphics g){
 
		Graphics2D g2 = (Graphics2D)g;
		//création du buffer si il n'existe pas
	    if(buffer==null){
	       image = createImage(fullscreen.getWidth(),fullscreen.getHeight());
	       buffer = image.getGraphics();
	    }
 
		/** Désactivation de l'anti-aliasing */
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
		g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
		/** Demande de rendu rapide */
		g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
		g2.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED);
		g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
		g2.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
 
		//draw the screen, offset in case the window isn't at 0,0
		g.drawImage(screen_buffer, -fullscreen.getX(), -fullscreen.getY(), null);
 
		//draw the frame
		Composite old_comp = g2.getComposite();
 
		Composite fade = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f-((float)count)/20f);
		g2.setComposite(fade);
		g2.drawImage(frame_buffer, frame.getX(), frame.getY(), null);
		g2.setComposite(old_comp);
 
   }
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
 
import com.rfo.framework.gui.tools.Dissolver;
import com.rfo.framework.gui.tools.SpinDissolver;
 
 
public class Test {
 
	static JTextField text;
	/**
         * @param args
         */
		public static void main(String[] args) {
		// TODO Auto-generated method stub
			final JFrame frame = new JFrame("Test");
 
			JButton quit = new JButton("Quit");
			quit.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent evt){
					new SpinDissolver().dissolveExit(frame);
				}
			});
 
			frame.getContentPane().add(quit);
			frame.pack();
			frame.setLocation(300,300);
			frame.setSize(400,400);
			frame.setVisible(true);
	}
 
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
 
public class SpinDissolver extends Dissolver{
 
	public void paint(Graphics g){
		Graphics2D g2 = (Graphics2D)g;
 
		/** Désactivation de l'anti-aliasing */
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
		g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
		/** Demande de rendu rapide */
		g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
		g2.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED);
		g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
		g2.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
 
 
		//draw the screen, offset in case the window isn't at 0,0
		g.drawImage(screen_buffer, -fullscreen.getX(), -fullscreen.getY(), null);
 
		//save the current transform
		AffineTransform old_trans = g2.getTransform();
 
		//move to the upper-lefthand corner of the frame
		g2.translate(frame.getX(), frame.getY());
 
		//move the frame off toward the left
		g2.translate(-((count+1) * (frame.getX()+frame.getWidth())/20),0);
 
		//shrink the frame
		float scale = 1f /((float)count+1);
		g2.scale(scale,scale);
 
		//rotate around the center
		g2.rotate(((float)count)/3.14/1.3, frame.getWidth()/2, frame.getHeight()/2);
 
		//finally draw the frame
		g2.drawImage(frame_buffer, 0, 0, null);
 
		//restore the current transform
		g2.setTransform(old_trans);
	}
 
}
[ Sujet déplacé depuis le forum java par Viena ]
Les Règles du Forum