Как я могу автоматически добавлять фигуры в paintComponent? - PullRequest
2 голосов
/ 30 августа 2011

Как новичок, всякий раз, когда я хочу добавить графические фигуры внутри рамки, я делаю что-то вроде этого:

public void paintComponent(Graphics g) {
    super.paintComponent(g); 
    g.fillRect(0, 0, 10, 10);
    g.fillOval(10,10,10,10);
}

Как автоматически нарисовать неограниченное количество фигур внутри рамки?Если я буду следовать тому, что делал выше, у меня будет только ограниченное количество фигур (Rect, Oval и ничего больше).

Я ищу что-то другое, например, всякий раз, когда вызывается метод addStuff(x, y), он рисует «Материал» автоматически по координатам x и y без необходимости что-либо редактировать внутри paintComponent снова вручную.

Я делал это с помощью пакета acm, и это было легко.Как и в приведенном ниже коде.

for (int i = 0; i < NCIRCLES; i++) {
    double r = rgen.nextDouble(MIN_RADIUS, MAX_RADIUS);
    double x = rgen.nextDouble(0, getWidth() - 2 * r);
    double y = rgen.nextDouble(0, getHeight() - 2 * r);
    GOval circle = new GOval(x, y, 2 * r, 2 * r);
    circle.setFilled(true);
    circle.setColor(rgen.nextColor());
    add(circle);
}

Как вы можете видеть выше, я могу добавить столько кругов, сколько захочу, я знаю, что это может занять страницы, чтобы объяснить это, но я просто хочу краткую инструкцию о том, каксоздайте нечто похожее на код выше, не полагаясь на пакет acm.

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Я бы использовал абстрактный класс для определения этого поведения.

abstract class OpalDraw {
    protected int x1, y1, x2, y2;
    protected OpalDraw(int x1, int y1, int x2, int y2) {
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
    }
    abstract public void draw(Graphics g);
}

class OpalOval {
    public OpalOval(int x1, int y1, int x2, int y2) { super(x1,y1,x2,y1); }
    public void draw(Graphics g) {
        g.drawOval(x1,y1,x2,y1);
    }
}

class OpalRect {
    public OpalRect(int x1, int y1, int x2, int y2) { super(x1,y1,x2,y1); }
    public void draw(Graphics g) {
        g.drawRect(x1,y1,x2,y1);
    }
}

Тогда в вашем контейнере для рисования вы можете иметь

addOval(int x1, int y1, int x2, int y2) {
    myDraws.add(new OpalOval(x1,x2,y1,y2);
}

addRect(int x1, int y1, int x2, int y2) {
    myDraws.add(new OpalRect(x1,x2,y1,y2);
}

Тогда позже внутри paintComponent(Graphics) вы можете

for(OpalDraw draw : myDraws) draw.draw(g);
1 голос
/ 30 августа 2011

В вашем классе, расширяющем JFrame, добавьте приватного члена, например

private ArrayList<Shape> shapes = new ArrayList<Shape>();

и ваши методы, например

public void addRectangle(int x, int y, int with, int height) {
    shapes.add(new Rectangle(x, y, width, height));
}

Тогда, в вашем paintBackground методе, есть что-то вроде

public void paintComponent(Graphics g) {
    super.paintComponent(g); 

    for (Shape shape : shapes) {
        if (shape instanceof Rectangle2D) {
            g.drawRect(shape.getX(), shape.getY(), shape.getWidth(), shape.getHeight());

        } else if (shape instanceof Ellipse2D) {
            // ...
        } // else if ...
            // etc.
    }
}

Как новичок, это должно быть довольно легко понять. Еще лучшим решением было бы иметь пользовательский интерфейс фигур (например, MyShape) с методом draw(Graphics g) и реализовывать свои формы из этого интерфейса (Circle implements MyShape, Square implements MyShape и т. Д.). Тогда ваш ArrayList<Shape> shapes может стать ArrayList<MyShape> shapes, а ваш paintBackground метод просто вызовет draw метод очень MyShape предметов.

...