You should attempt to reduce the amount of short-lived objects you are creating in your paint method (IMHO).
Start by creating a List
of Shape
, which you can add the individual blades to
private List<Shape> blades;
Fill this with the individual blades...
public MyPanel() {
blades = new ArrayList<>(25);
blades.add(new Arc2D.Double(10, 500, 10, 35, 105, 180, Arc2D.OPEN));
blades.add(new Arc2D.Double(20, 500, 10, 35, 105, 180, Arc2D.OPEN));
blades.add(new Arc2D.Double(30, 500, 10, 35, 105, 180, Arc2D.OPEN));
blades.add(new Arc2D.Double(40, 500, 10, 35, 105, 180, Arc2D.OPEN));
blades.add(new Arc2D.Double(50, 500, 10, 35, 105, 180, Arc2D.OPEN));
blades.add(new Arc2D.Double(5, 510, 10, 35, 105, 180, Arc2D.OPEN));
blades.add(new Arc2D.Double(15, 510, 10, 35, 105, 180, Arc2D.OPEN));
blades.add(new Arc2D.Double(25, 510, 10, 35, 105, 180, Arc2D.OPEN));
blades.add(new Arc2D.Double(35, 510, 10, 35, 105, 180, Arc2D.OPEN));
blades.add(new Arc2D.Double(45, 520, 10, 35, 105, 180, Arc2D.OPEN));
blades.add(new Arc2D.Double(10, 520, 10, 35, 105, 180, Arc2D.OPEN));
blades.add(new Arc2D.Double(20, 520, 10, 35, 105, 180, Arc2D.OPEN));
blades.add(new Arc2D.Double(30, 520, 10, 35, 105, 180, Arc2D.OPEN));
blades.add(new Arc2D.Double(40, 520, 10, 35, 105, 180, Arc2D.OPEN));
blades.add(new Arc2D.Double(50, 520, 10, 35, 105, 180, Arc2D.OPEN));
}
Then simply iterate the list in the paintComponent
method...
Color yellowGreen = new Color(107, 142, 35);
g2.setColor(yellowGreen);
for (Shape blade : blades) {
g2.draw(blade);
}
Now, another option might be to create a BufferedImage
and paint the "static" elements to it and simply paint the image when paintComponent
is called.
Also, you must call super.paintComponent
before you do any of your custom painting, otherwise you will end with weird paint artifacts.
You can further reduce it by doing something like...
blades = new ArrayList<>(25);
for (int x = 10; x < 50; x += 10) {
blades.add(new Arc2D.Double(x, 500, 10, 35, 105, 180, Arc2D.OPEN));
}
for (int x = 5; x < 45; x += 10) {
blades.add(new Arc2D.Double(x, 510, 10, 35, 105, 180, Arc2D.OPEN));
}
for (int x = 10; x < 50; x += 10) {
blades.add(new Arc2D.Double(x, 520, 10, 35, 105, 180, Arc2D.OPEN));
}
Or even...
for (int x = 10; x < 200; x += 10) {
blades.add(new Arc2D.Double(x, 500, 10, 35, 105, 180, Arc2D.OPEN));
blades.add(new Arc2D.Double(x - 5, 510, 10, 35, 105, 180, Arc2D.OPEN));
blades.add(new Arc2D.Double(x, 520, 10, 35, 105, 180, Arc2D.OPEN));
}