package fade;
/*
* FadeDemo.java
*
* last update: 01.05.2007
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.util.*;
import javax.swing.*;
public class FadeDemo extends JFrame implements Runnable{
private JToolBar toolbar;
private JButton btNext, btStop;
private JSlider slDelay;
private boolean start, stop;
private BildPanel panel;
public FadeDemo() {
super("Fade Demo");
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
//JComponents erzeugen:
toolbar = new JToolBar();
btNext = new JButton("Start");
btStop = new JButton("Stop");
slDelay = new JSlider(3, 150, 40);
panel = new BildPanel(400, 300);
//Layout:
getRootPane().setDefaultButton(btNext);
btNext.setPreferredSize(new Dimension(50,22));
btStop.setEnabled(false);
btStop.setPreferredSize(btNext.getPreferredSize());
toolbar.add(btNext);
toolbar.add(btStop);
toolbar.add(new JLabel(" Delay: "));
toolbar.add(slDelay);
getContentPane().add(toolbar, BorderLayout.SOUTH);
getContentPane().add(panel, BorderLayout.CENTER);
pack();
setLocationRelativeTo(null);
//Listener:
btNext.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent evt) {
btNextActionPerformed(evt);
}
});
btStop.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent evt) {
btStopActionPerformed(evt);
}
});
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
stop = true;
if(btStop.isEnabled()){
btStop.doClick();
}else{
dispose();
}
}
});
}
private void btNextActionPerformed(final ActionEvent evt) {
btNext.setText("Next");
panel.setNextPicture(slDelay.getValue());
// Thread für den Fade-Effekt:
start = true;
new Thread(this).start();
}
private void btStopActionPerformed(final ActionEvent evt) {
btNext.setText("Start");
panel.setNextPicture(0, slDelay.getValue());
// Thread für den Fade-Effekt:
start = false;
new Thread(this).start();
panel.startGrabbing();
}
public void run() {
btNext.setEnabled(false);
btStop.setEnabled(false);
slDelay.setEnabled(false);
panel.resetFadeProgress();
for (int i = 0; i < slDelay.getValue(); i++) {
panel.repaint();
try {Thread.sleep(30);} catch (InterruptedException ex) {}
}
if(stop) dispose();
btNext.setEnabled(true);
btStop.setEnabled(start);
slDelay.setEnabled(true);
}
public static void main(final String args[]) {new FadeDemo().setVisible(true);}
}
class BildPanel extends JPanel{
private int fadeProgress, width, height, bufferSize, delay, next;
private int[] buffer_1, buffer_2, buffer_3;
private MemoryImageSource imageProducer;
private Thread grabberThread;
private Image bild;
private Image[] pictures;
public BildPanel(final int w, final int h){
width = w; height = h; delay = 40;
setPreferredSize(new Dimension(width, height));
pictures = new Image[3];
pictures[0] = new ImageIcon("c:\\Picture1.jpg").getImage().getScaledInstance(width, -1, Image.SCALE_SMOOTH);
pictures[1] = new ImageIcon("c:\\Picture2.jpg").getImage().getScaledInstance(width, -1, Image.SCALE_SMOOTH);
pictures[2] = new ImageIcon("c:\\Picture3.jpg").getImage().getScaledInstance(width, -1, Image.SCALE_SMOOTH);
bufferSize = width * height;
buffer_1 = new int[bufferSize];
buffer_2 = new int[bufferSize];
buffer_3 = new int[bufferSize];
imageProducer = new MemoryImageSource(width, height, buffer_1, 0, width);
imageProducer.setAnimated(true);
bild = createImage(imageProducer);
startGrabbing();
}
protected void paintComponent(final Graphics graphics) {
fadeProgress++;
if(fadeProgress < delay) {
double fadeFactor = 1d / (((double)delay) - (double)fadeProgress);
for(int i = 0; i < bufferSize; i++) {
int nextColor = buffer_1[i];
int r = nextColor >> 16 & 0xff;
int g = nextColor >> 8 & 0xff;
int b = nextColor & 0xff;
nextColor = buffer_2[i];
r -= (int)((double)(r - (nextColor >> 16 & 0xff)) * fadeFactor);
g -= (int)((double)(g - (nextColor >> 8 & 0xff)) * fadeFactor);
b -= (int)((double)(b - (nextColor & 0xff)) * fadeFactor);
nextColor = 0xff000000 | r << 16 | g << 8 | b;
buffer_1[i] = nextColor;
}
imageProducer.newPixels();
} else {
fadeProgress = 0;
System.arraycopy(buffer_2, 0, buffer_1, 0, bufferSize);
}
graphics.drawImage(bild, 0, 0, null);
}
public void setNextPicture(final int n, final int del){
delay = del;
next = n;
Arrays.fill(buffer_2, 0);
}
public void setNextPicture(final int del){
delay = del;
try {grabberThread.join();} catch (InterruptedException ex) {}
System.arraycopy(buffer_3, 0, buffer_2, 0, bufferSize);
next++;
if(next >= pictures.length) next=0;
startGrabbing();
}
public void startGrabbing(){
grabberThread = new Thread(new Runnable() {
public void run() {
try {
Arrays.fill(buffer_3, 0);
PixelGrabber grabber = new PixelGrabber(pictures[next], 0, 0, width, height, buffer_3, 0, width);
grabber.grabPixels();
} catch(InterruptedException _ex) {
}
}
});
grabberThread.start();
}
public void resetFadeProgress(){
fadeProgress = 0;
}
}