import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class MorphingRect extends JFrame {
private MorphingPanel2 mPanel;
public MorphingRect() {
mPanel = new MorphingPanel2(
new Rectangle(10, 10, 300, 300), Color.YELLOW,
new Rectangle(210, 210, 180, 150), Color.BLUE,
10
);
JSlider slider = new JSlider(JSlider.VERTICAL, 0, 50, 10);
slider.setMajorTickSpacing(10);
slider.setPaintLabels(true);
slider.setPaintTicks(true);
slider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
mPanel.setSteps(((JSlider) e.getSource()).getValue());
}
});
this.getContentPane().add(mPanel, BorderLayout.CENTER);
this.getContentPane().add(slider, BorderLayout.EAST);
}
class MorphingPanel2 extends JPanel {
private ArrayList<Rectangle> rectList;
private ArrayList<Color> colorList;
private Rectangle rect1, rect2;
private Color color1, color2;
public MorphingPanel2(Rectangle rect1, Color color1, Rectangle rect2, Color color2, int steps) {
this.rect1 = rect1;
this.color1 = color1;
this.rect2 = rect2;
this.color2 = color2;
setSteps(steps);
}
public void setSteps(int steps) {
rectList = new ArrayList<Rectangle>();
colorList = new ArrayList<Color>();
rectList.add(rect1);
colorList.add(color1);
for(int i=1; i<steps; i++) {
int x = rect1.x - (rect1.x - rect2.x)*i/steps;
int y = rect1.y - (rect1.y - rect2.y)*i/steps;
int w = rect1.width - (rect1.width - rect2.width)*i/steps;
int h = rect1.height - (rect1.height - rect2.height)*i/steps;
rectList.add(new Rectangle(x, y, w, h));
Color color = new Color(
color1.getRed() - (color1.getRed()- color2.getRed())*i/steps,
color1.getGreen() - (color1.getGreen()- color2.getGreen())*i/steps,
color1.getBlue() - (color1.getBlue()- color2.getBlue())*i/steps);
colorList.add(color);
}
rectList.add(rect2);
colorList.add(color2);
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g.create();
for (int i=0; i<rectList.size(); i++) {
g2.setColor(colorList.get(i));
g2.fill(rectList.get(i));
}
g2.dispose();
}
}
public static void main(String[] args) {
JFrame frame = new MorphingRect();
frame.setBounds(0, 0, 600, 400);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}