import java.awt.*;
import java.net.*;
import javax.swing.*;
public class Spiegelung extends JPanel implements Runnable
{
private Image bild = null;
private int phase = 0;
private int wellenhoehe = 3;
private int[][] regen = new int[200][3];
private int regencounter = 0;
public Spiegelung(String s)
{
// Bild laden
try
{
bild = new ImageIcon(new URL(s)).getImage();
} catch (Exception e)
{
System.out.println("Bild nicht gefunden!");
}
// JPanel-Groesse setzen
setPreferredSize(new Dimension(bild.getWidth(null), bild
.getHeight(null)));
for( int i=0; i<regen.length; i++ )
neuerRegen(i);
// Aktualisier-Thread starten
new Thread(this).start();
}
public void paint(Graphics g)
{
// Groesse des Bildes ermitteln
int w = bild.getWidth(null);
int h = bild.getHeight(null);
// Position der Wassergrenze berechnen
int m = h * 2 / 3;
// Hintergrund zeichnen
g.drawImage(bild, 0, 0, null);
// Spiegelung zeichnen
for (int y = m; y < h; y++)
{
int q = (int) (m - Math.pow(y - m, 1.1) + wellenhoehe
* Math.sin(y * .25 + phase * .5));
g.drawImage(bild, 0, y, w, y + 1, 0, q, w, q + 1, null);
}
g.setColor(new Color(0, 0, 255, 20));
for( int i=0; i<regen.length; i++ )
{
if( regen[i][1]==0 || regen[i][1]>h+20-regen[i][2]*10 )
{
neuerRegen(i);
regen[i][1]=0;
}
g.drawLine(regen[i][0],regen[i][1],regen[i][0]+regen[i][2],regen[i][1]+regen[i][2]*3);
regen[i][0]+=regen[i][2];
regen[i][1]+=regen[i][2]*3;
}
regencounter = (regencounter+1)%regen.length;
// halbtransparentes blau über die Spiegelung zeichnen
g.fillRect(0, m, w, h - m);
}
private void neuerRegen( int i )
{
regen[i][0] = (int)(Math.random()*bild.getWidth(null));
regen[i][1] = (int)(Math.random()*bild.getHeight(null));
regen[i][2] = (int)(3*Math.random())+3;
}
public void run()
{
while (true)
{
repaint();
phase++;
try
{
Thread.sleep(50);
} catch (Exception e)
{
}
}
}
public static void main(String[] args) throws Exception
{
// neuen Frame mit einer Spiegelung erzeugen
JFrame f = new JFrame("Eine Beispielspiegelung");
String url = "http://www.sz.ruhr-uni-bochum.de/imperia/md/images/sz/greihe75.jpg";
f.getContentPane().add( new Spiegelung(url) );
f.pack();
f.setVisible(true);
}
}