paintComponent удаляет ранее нарисованные компоненты - PullRequest
3 голосов
/ 24 декабря 2011

Я пишу простую программу рисования.Я создал JPanel и переписал "public void paintComponent(Graphics g)", я также создал соответствующий Listeners.Проблема в том, что каждый раз, когда я рисую новую фигуру, моя предыдущая исчезает. Кто-нибудь знает, как мне сохранить прежние фигуры на их месте?Я могу забрать super.paintComponent(g), но тогда Jpanel's layout будет искажен.Любое предложение высоко ценится.:) это мой метод paintComponent:

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


    int width = xend-xstart;
    int height = yend - ystart;
    if(width<0)
        width *= -1;
    if(height <0)
        height *= -1;
    if(color!= null && shape !=null){
    if(fill.isSelected())
    {
        g.setColor(color);
        if(shape.equals("Rectangle"))
            g.fillRect(xstart, ystart, width, height);
        if(shape.equals("Square"))
            g.fillRect(xstart, ystart, width, width);
        if(shape.equals("Circle"))
            g.fillOval(xstart,ystart,width ,width);

    }
    }

} 

Ответы [ 2 ]

4 голосов
/ 24 декабря 2011

Чтобы нарисовать несколько объектов "Прямоугольник", "Квадрат" или "Круг", необходимо добавить их в коллекцию (например, ArrayList‌) и каждый вызов paintComponent(Graphics), выполнить итерациюколлекцию и рисовать каждый.

Либо так, либо нарисуйте фигуры в BufferedImage и вместо этого нарисуйте изображение.

.. не повлияет ли это на эффективность, так как я рисую все больше и больше фигур?потому что тогда paintComponent должен рисовать много фигур каждый раз, когда я вызываю repaint ();

Есть 3 ответа, которые я могу дать на это.Вот они:

  1. Да, будет.
  2. Но нет, должно быть тысяч , прежде чем вызвать видимое замедление.
  3. В случае, если производительность является проблемой.Используйте BufferedImage.Таким образом, для каждой новой добавляемой фигуры рисуется только еще одна фигура, независимо от того, сколько .. миллионов ранее было отрисовано.

.. также мне нужно написать функцию отмены, и список также будет полезен в этом случае

Звучит так, будто список - это путь для этого варианта использования,

0 голосов
/ 24 декабря 2011

Ответ Эндрю Томпсона - это «типичный» способ сделать то, что вы хотите.Однако, если вы хотите погрузиться глубже в глубины Swing ...

Одна из вещей, которую super.paintComponent () делает (в конце концов), это получение JComponent.paintComponent(), что вызывает ComponentUI.update().В Javadocs написано (курсив добавлен мной):

"По умолчанию этот метод заменит указанный компонент цветом фона (, если его непрозрачное свойство равно true ), а затем немедленно вызовет paint."

Итак, попробуйте позвонить setOpaque(false).Однако это часто приводит к другим проблемам, например, когда вы действительно делаете хотите стереть то, что было нарисовано ранее.

...