0

我正在尝试将一些(外观丑陋的)代码转换为函数,以便更好地管理所有内容。但是我遇到了一个问题,当前代码:

    int red = card.getColor().getRed();
    int green = card.getColor().getGreen();
    int blue = card.getColor().getBlue();
    Color color = new Color(red, green, blue);

    int width;
    int height;
    int xOffset;
    int yOffset;
    int border;

    //Whole card
    width = CARD_DIMENSION.width;
    height = CARD_DIMENSION.height;
    xOffset = 0;
    yOffset = 0;
    border = 5;
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            int dx = Math.min(x, width - 1 - x);
            int dy = Math.min(y, height - 1 - y);
            if (dx < border || dy < border) {
                g2d.setColor(new Color(red, green, blue, 255 - Math.min(dx, dy)));
            }
            else {
                g2d.setColor(new Color(red, green, blue, 192 - Math.min(dx, dy)));
            }
            g2d.drawLine(x + xOffset, y + yOffset, x + xOffset, y + yOffset);
        }
    }

每次我想绘制一些新的矩形时,我都必须复制它。乍一看,将它放在一个函数中并不难,但是这些行:

            if (dx < border || dy < border) {
                g2d.setColor(new Color(red, green, blue, 255 - Math.min(dx, dy)));
            }
            else {
                g2d.setColor(new Color(red, green, blue, 192 - Math.min(dx, dy)));
            }

自从我在那里使用 dx 和 dy 后,它们变得很困难。

现在我提出了一个建议的解决方案,我想将它与匿名内部类一起使用并覆盖这两个函数:

private abstract class CustomRectangle {
    protected final int width;
    protected final int height;
    protected final int xOffset;
    protected final int yOffset;
    protected final int borderSize;

    public CustomRectangle(final int width, final int height, final int xOffset, final int yOffset, final int borderSize) {
        this.width = width;
        this.height = height;
        this.xOffset = xOffset;
        this.yOffset = yOffset;
        this.borderSize = borderSize;
    }

    abstract void inBorder();

    abstract void outBorder();

    public void draw(Graphics2D g2d) {
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                int dx = Math.min(x, width - 1 - x);
                int dy = Math.min(y, height - 1 - y);
                if (dx < borderSize || dy < borderSize) {
                    inBorder();
                }
                else {
                    outBorder();
                }
                g2d.drawLine(x + xOffset, y + yOffset, x + xOffset, y + yOffset);
            }
        }
    }
}

但我仍然担心使用 dx 和 dy(for 循环的两个局部变量)输入公式会很困难,如果不是不可能的话。

如果有人对一般问题或我自己的方法有任何建议,我将不胜感激,因为拥有几个基本相同的代码块是不可接受的。

问候。

4

0 回答 0