FileDocCategorySizeDatePackage
DissolveHack.javaAPI DocExample3286Mon Jan 09 11:01:58 GMT 2006None

DissolveHack.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.*;
import java.awt.geom.*;

public class DissolveHack {

	public static void main(String[] args) {
		
		final JFrame frame = new JFrame("Dissolve Hack");
		JButton quit = new JButton("Quit");
		quit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				new Dissolver().dissolveExit(frame);
			}
		});
		
		frame.getContentPane().add(quit);
		frame.pack();
		frame.setLocation(300,300);
		frame.setSize(400,400);
		frame.setVisible(true);
		
	}
}


class Dissolver extends JComponent implements Runnable {
	
	public Dissolver() {
	}
	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 ex) {
			System.out.println(ex);
			ex.printStackTrace();
		}
	}
	
	Frame frame;
	Window fullscreen;
	BufferedImage frame_buffer;
	BufferedImage screen_buffer;
	int count;
	
	public void paint(Graphics g) {
		Graphics2D g2 = (Graphics2D)g;
		// 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);
	}
	
	public void run() {
		try {
			count = 0;
			Thread.currentThread().sleep(100);
			for(int i=0; i<20; i++) {
				count = i;
				fullscreen.repaint();
				Thread.currentThread().sleep(100);
			}
		} catch (InterruptedException ex) {
		}
		System.exit(0);
	}
	
}


class SpinDissolver extends Dissolver {
	
	public void paint(Graphics g) {
		Graphics2D g2 = (Graphics2D)g;
		// 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 left hand corner of the frame
		g2.translate(frame.getX(), frame.getY());
		
		// move the frame off towards 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);
	}
	
}