Как бы я вложил форму в форму в Java? - PullRequest
1 голос
/ 16 мая 2011

Я пытаюсь выполнить задание, связанное с подпрыгивающими фигурами в JPanel. Всякий раз, когда фигуры ударяются о сторону, они отскакивают в другом направлении. У меня уже есть прыгающая часть, работающая на нормальные фигуры, но теперь мне нужно сделать NestingShape.

NestingShape - это прямоугольник, который содержит ноль или более фигур, которые подпрыгивают внутри него, в то время как NestingShape отскакивает вокруг в JPanel. Дочерними экземплярами экземпляра NestingShape могут быть либо простые Shapes, например объекты RectangleShape и OvalShape, либо другие экземпляры NestingShape.

Ниже приведена спецификация для NestingShape:

public class NestingShape extends Shape {   
    /**
     * Creates a NestingShape object with default values for state.
     */
    public NestingShape() {
        super();
    }

    /**
     * Creates a NestingShape object with specified location values, default values for other
     * state items.
     */
    public NestingShape(int x, int y) {
        super(x,y);
    }

    /**
     * Creates a NestingShape with specified values for location, velocity and direction.
     * Non-specified state items take on default values.
     */
    public NestingShape(int x, int y, int deltaX, int deltaY) {
        super(x,y,deltaX,deltaY);
    }

    /**
     * Creates a NestingShape with specified values for location, velocity, direction, width, and
     * height.
     */
    public NestingShape(int x, int y, int deltaX, int deltaY, int width, int height) {
        super(x,y,deltaX,deltaY,width,height);
    }

    /**
     * Moves a NestingShape object (including its children) with the bounds specified by arguments
     * width and height.
     */
    public void move(int width, int height) {
        //Not yet implemented
    }

    /**
     * Paints a NestingShape object by drawing a rectangle around the edge of its bounding box.
     * The NestingShape object's children are then painted.
     */
    public void paint(Painter painter) {
        painter.drawRect(fX,fY,fWidth,fHeight);
        painter.translate(fX,fY);
        // Paint children here. Not implemented yet
        painter.translate(0,0);
}

    /**
     * Attempts to add a Shape to a NestingShape object. If successful, a two-way link is
     * established between the NestingShape and the newly added Shape. Note that this method
     * has package visibility - for reasons that will become apparent in Bounce III.
     * @param shape the shape to be added.
     * @throws IllegalArgumentException if an attempt is made to add a Shape to a NestingShape
     * instance where the Shape argument is already a child within a NestingShape instance. An
     * IllegalArgumentException is also thrown when an attempt is made to add a Shape that will
     * not fit within the bounds of the proposed NestingShape object.
     */
    void add(Shape shape) throws IllegalArgumentException {
        // Not implemented yet  
    }

    /**
     * Removes a particular Shape from a NestingShape instance. Once removed, the two-way link
     * between the NestingShape and its former child is destroyed. This method has no effect if
     * the Shape specified to remove is not a child of the NestingShape. Note that this method
     * has package visibility - for reasons that will become apparent in Bounce III.
     * @param shape the shape to be removed.
     */
    void remove(Shape shape) {
        // Not implemented yet
    }

    /**
     * Returns the Shape at a specified position within a NestingShape. If the position specified
     * is less than zero or greater than the number of children stored in the NestingShape less
     * one this method throws an IndexOutOfBoundsException.
     * @param index the specified index position.
     */
    public Shape shapeAt(int index) throws IndexOutOfBoundsException {
        // Not implemented yet
    }

    /**
     * Returns the number of children contained within a NestingShape object. Note this method is
     * not recursive - it simply returns the number of children at the top level within the callee
     * NestingShape object.
     */
    public int shapeCount() {
        // Not implemented yet
    }

    /**
     * Returns the index of a specified child within a NestingShape object. If the Shape specified
     * is not actually a child of the NestingShape this method returns -1; otherwise the value
     * returned is in the range 0 .. shapeCount() - 1.
     * @param the shape whose index position within the NestingShape is requested.
     */
    public int indexOf(Shape shape) {
        // Not implemented yet
    }

    /**
     * Returns true if the shape argument is a child of the NestingShape object on which this method
     * is called, false otherwise.
     */
    public boolean contains(Shape shape) {
        // Not implemented yet
    }
}

Я не уверен, обеспечивает ли это достаточный контекст, но у меня возникли проблемы с реализацией методов add и remove. Когда говорится, что «между NestingShape и недавно добавленной Shape установлена ​​двусторонняя связь», я не знаю, как бы я поступил так. Буду ли я использовать ArrayList или Список форм или что-то еще? Есть ли какие-либо подсказки о том, как мне реализовать метод add и где метод будет вызываться из этого кода?

Спасибо.

1 Ответ

2 голосов
/ 16 мая 2011

Если я правильно понял, вам действительно нужно иметь какой-то список (например, ArrayList) или упорядоченный набор дочерних элементов внутри этой вложенной формы, чтобы у вложенной формы могло быть больше дочерних элементов. Затем вы можете использовать метод списка для проверки при добавлении фигуры, если она уже содержится, а также для удаления и вставки фигур.

Когда они говорят, что вы устанавливаете двустороннее соединение, они означают, что вы должны как-то сказать, что вставленная фигура теперь является ее новым родителем - это заданная вложенная фигура. Вы не дали нам интерфейс класса shape (и он не похож на стандартный java.awt.Shape, поскольку это интерфейс). Ваш класс фигур каким-то образом ссылается на родительский прямоугольник, чтобы знать, по каким границам он должен двигаться, поэтому вы должны установить этот родительский элемент как вложенную форму при вставке дочерней формы в вложенную форму. Вы также должны удалить это родительско-дочернее отношение после удаления фигуры из вложенной фигуры.

Мне понадобится больше информации о классе формы, чтобы дать более подробный ответ, но я считаю, что это то, что вы искали;)

...