如何修复Java Applet的代码太大错误?

时间:2014-06-10 23:24:15

标签: java compiler-errors applet paint polygon

import java.applet.Applet;
import java.awt.*;
public class ShadowApplet extends Applet
{
    public void paint (Graphics page)
    {
        setBackground (Color.white);
        page.setColor(Color.black);
        int x[]={1,1,4,4};
        int y[]={1,4,1,4};
        page.fillPolygon(x,y,x.length);
    }
}

我必须使用上述格式的代码绘制一个复杂的图像,除了我的数组有数百和数百个点,我有几十个多边形。随着我的第26个多边形的输入,我的Java小程序将不再编译说我的代码太大了。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

首先将代码分解为可重复使用的块

例如,您可以尝试将坐标保持在一个或多个多维数组中......

int[][] xPoints = {{1,1,4,4}, {...}};
int[][] yPoints = {{1,4,1,4}, {...}};

然后使用for-loop绘制它们......

for (int index = 0; index < xPoints.length; index++) {
    int[] x = xPoints[index];
    int[] y = yPoints[index];
    page.fillPolygon(x,y,x.length);
}

现在,我不知道,但随着元素数量的增加,这很难管理......

另一个想法可能是创建一个简单的“助手”类,专注于管理单个元素......

你可以从一个简单的界面开始,它只知道如何绘制自己,例如......

public interface PolyPainter {
    public void paint(Graphics g);
}

创建实现,它们是整个...的自包含部分。

public class PolyHelper implements PolyPainter {
    private int[] xPoints;
    private int[] xPoints;

    public PolyHelper() {
    }

    public PolyHelper(int[] xPoints, int[] yPoints) {
        this.xPoints = xPoints;
        this.yPoints = yPoints;
    }

    public void paint(Graphics g) {
        if (xPoints != null & yPoints != null) {
            g.fillPolygon(xPoints, yPoints , xPoints.length);
        }
    }
}

然后你可以根据需要创建每个实例......

PolyHelper helper = new PolyHelper(new int[]{1,1,4,4}, new int[]{1,4,1,4});

或创建专业课......

public class TopPart extends PolyHelper {
    public TopPart() {
        super(new int[]{1,1,4,4}, new int[]{1,4,1,4});
    }
}

在任何一种情况下,您都可以在List或数组......

中管理这些类
public class ShadowApplet extends Applet
    private List<PolyPainter> polyPainters = new ArrayList<>(25);

    public void init() {
        polyPainers.add(new PolyHelper(new int[]{1,1,4,4}, new int[]{1,4,1,4}));
        polyPainers.add(new TopPart());
        //...
    }

然后你只需要迭代列表来绘制它们......

public void paint(Graphics g) {
    super.paint(g);
    for (PolyPainter painter : polyPainters) {
        painter.paint(g);
    }
}

现在说了所有......

我建议:

  1. 您可以避免使用Applet并以JPanel开头,而是覆盖paintComponent。除了顶级容器(如Applet不是双缓冲的事实)之外,使用JPanel作为基础的东西不仅可以让您进入更新的API,还可以提供自动双倍缓冲。它还会将您与给定的顶级容器分离,并且可以更轻松地重新使用该组件,因为您可以将JPanel添加到您想要的容器中...查看{{3更多详情
  2. 使用2D Graphics API提供的Shape(或几何)API,它完成了我在下半场开箱即用的大部分内容。有关详细信息,请查看Performing Custom PaintingWorking with Geometry