首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何简化graphic2d的这段代码?

如何简化graphic2d的这段代码?
EN

Stack Overflow用户
提问于 2014-04-09 05:46:44
回答 1查看 74关注 0票数 0

必须有一个更容易的方法来做到这一点,使刀片的草!请帮帮我!可能是某种循环或者数组。草的刀片,你可以告诉交替每一行弧形,但写出来都是太费时。

代码语言:javascript
复制
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Arc2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class MyPanel extends JPanel

{public void paintComponent(Graphics g)
  { Graphics2D g2=(Graphics2D)g;

    //Background
    Rectangle background = new Rectangle(0,0,getWidth(),getHeight());
    Color skyBlue = new Color(135,206,235);
    g2.setColor(skyBlue);
    g2.fill (background);

    //Grass
    Rectangle grass = new Rectangle(0,525,getWidth(),100);
    Color lawnGreen = new Color(124,252,0);
    g2.setColor(lawnGreen);
    g2.fill(grass);

    Arc2D.Double blade1 = new Arc2D.Double(10,500,10,35,105,180,Arc2D.OPEN);
    Arc2D.Double blade2 = new Arc2D.Double(20,500,10,35,105,180,Arc2D.OPEN);
    Arc2D.Double blade3 = new Arc2D.Double(30,500,10,35,105,180,Arc2D.OPEN);
    Arc2D.Double blade4 = new Arc2D.Double(40,500,10,35,105,180,Arc2D.OPEN);
    Arc2D.Double blade5 = new Arc2D.Double(50,500,10,35,105,180,Arc2D.OPEN);
    Arc2D.Double blade6 = new Arc2D.Double(5,510,10,35,105,180,Arc2D.OPEN); 
    Arc2D.Double blade7 = new Arc2D.Double(15,510,10,35,105,180,Arc2D.OPEN);
    Arc2D.Double blade8 = new Arc2D.Double(25,510,10,35,105,180,Arc2D.OPEN);
    Arc2D.Double blade9 = new Arc2D.Double(35,510,10,35,105,180,Arc2D.OPEN);
    Arc2D.Double blade10 = new Arc2D.Double(45,520,10,35,105,180,Arc2D.OPEN);
    Arc2D.Double blade11 = new Arc2D.Double(10,520,10,35,105,180,Arc2D.OPEN);
    Arc2D.Double blade12 = new Arc2D.Double(20,520,10,35,105,180,Arc2D.OPEN); 
    Arc2D.Double blade13 = new Arc2D.Double(30,520,10,35,105,180,Arc2D.OPEN);
    Arc2D.Double blade14 = new Arc2D.Double(40,520,10,35,105,180,Arc2D.OPEN);
    Arc2D.Double blade15 = new Arc2D.Double(50,520,10,35,105,180,Arc2D.OPEN);


    Color yellowGreen = new Color(107,142,35);
    g2.setColor(yellowGreen);
    g2.fill(blade1);
    g2.fill(blade2);
    g2.fill(blade3);
    g2.fill(blade4);
    g2.fill(blade5);
    g2.fill(blade6);
    g2.fill(blade7);
    g2.fill(blade8);
    g2.fill(blade9);
    g2.fill(blade10);
    g2.fill(blade11);
    g2.fill(blade12);
    g2.fill(blade13);
    g2.fill(blade14);
    g2.fill(blade15);

    Ellipse2D.Double circle = new Ellipse2D.Double(60,100,25,25);
    g2.setColor(Color.RED);
    g2.fill(circle);
    Rectangle box = new Rectangle(150,100,20,80);
    g2.setColor(Color.YELLOW);
    g2.fill(box);

    Line2D.Double line = new Line2D.Double(10,10,150,150);
    g2.setColor(Color.BLUE);
       g2.draw(line);
 }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-09 05:55:10

您应该尝试减少在画图方法(IMHO)中创建的短期对象的数量。

首先创建一个List of Shape,您可以将各个刀片添加到其中

代码语言:javascript
复制
 private List<Shape> blades;

用单刀填满这个..。

代码语言:javascript
复制
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));
}

然后简单地迭代paintComponent方法中的列表..。

代码语言:javascript
复制
Color yellowGreen = new Color(107, 142, 35);
g2.setColor(yellowGreen);
for (Shape blade : blades) {
    g2.draw(blade);
}

现在,另一个选项可能是创建一个BufferedImage并为其绘制“静态”元素,并在调用paintComponent时简单地绘制图像。

此外,您必须在进行任何自定义绘制之前调用super.paintComponent,否则将以奇怪的画图工件结束。

你可以通过做这样的事情来进一步减少它。

代码语言:javascript
复制
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));
}

甚至..。

代码语言:javascript
复制
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));
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22953822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档