import java.awt.AlphaComposite; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.Paint; import java.awt.Transparency; import java.awt.image.BufferedImage; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; /** * Diese Pane enthält eine Komponente und erzeugt einen Spiegeleffekt. Um den * Code möglichst unkompliziert zu halten, sind einige Optimierungen weggelassen * worden. */ public class MirrorPane extends JPanel { private BufferedImage image; // Image auf welches die Komponenten gezeichnet werden public MirrorPane() { setBackground(Color.BLACK); setLayout(new GridLayout(2,1)); setBorder(new EmptyBorder(20,20,20,20)); /* * Adde jweils nur eine der beiden folgenden Komponenten, weil der * Spiegeleffekt sonst über die Komponenten gezeichnet würde. */ add(new PerfDraw(100)); // add(new OpaqueButton("This is a Button",0.25f)); } @Override public void paintChildren(Graphics g) { // Falls das image die falsche Grösse hat, erstelle ein neues. if (image==null || image.getWidth()!=getWidth() || image.getHeight()!=getHeight()) { image = new BufferedImage(getWidth(), getHeight(), Transparency.TRANSLUCENT); } // Auf einem Image darf getGraphics aufgerufen werden (auf einem Panel auf keinen Fall) Graphics gi = image.getGraphics(); // Zeichne die Kinder auf das Bild super.paintChildren(gi); // Zeichne das Bild auf das Graphics Objekt Graphics2D g2 = (Graphics2D) g.create(); g2.drawImage(image,0,0,null); // Zeichne die Reflexion paintReflection(g2); } private void paintReflection(Graphics2D g2) { int height = (int) (getHeight() * .65f); Graphics2D gi = image.createGraphics(); // Verlauf von transparent Schwarz nach total transparent Paint alphaMask = new GradientPaint( 0.0f, height/4, new Color(0.0f, 0.0f, 0.0f, 0f), 0.0f, height, new Color(0.0f, 0.0f, 0.0f, .75f), false); gi.setPaint(alphaMask); // Lösche einen Teil aus dem Bild heraus (gemäss Verlauf von oben) gi.setComposite(AlphaComposite.DstIn); gi.fillRect(0,0,image.getWidth(),image.getHeight()); // Kehre g2 auf den Kopf und zeichne das Spiegelbild hinein g2.scale(1.0, -1.0); g2.drawImage(image, 0, -getHeight()-10, null); } /** * Zeichnet einen Verlauf im Hintergrund */ // @Override // public void paintComponent(Graphics g) { // Graphics2D g2 = (Graphics2D) g.create(); // GradientPaint gradint = new GradientPaint(new Point(0,0),new Color(250,180,255),new Point(0,getHeight()),new Color(100,100,255)); // g2.setPaint(gradint); // Rectangle clip = g.getClipBounds(); // g2.fillRect(clip.x, clip.y, clip.width, clip.height); // g2.dispose(); // } }