Перерисовка графики в Java - PullRequest
3 голосов
/ 13 марта 2011

Я только начинаю изучать графику на Java, и у меня проблема. Я создал окно JFrame (NetBeans Designer) с панелью JPanel и нарисовал на нем немного графики. Затем я добавил JButton, который изменил переменную, которая изменит положение X квадрата на JPanel.

При нажатии кнопки этот код будет выполнен:

drawObject.setX(150);
drawObject.repaint();

drawObject является экземпляром этого класса:

public class sola extends JPanel {

    private int x = 10;

    @Override
    public void paintComponent(Graphics g){
        super.paintComponents(g);
        super.setBackground(Color.WHITE);

        g.setColor(Color.ORANGE);
        g.fill3DRect(x, 160, 100, 50, true);
    }

    public void setX(int xX){
        x = xX;
    }
}

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

Ответы [ 3 ]

3 голосов
/ 13 марта 2011

Это

super.paintComponent(g);

не

super.paintComponents(g);  // note the s at the edn

Большая разница между двумя!Первый говорит вашему JPanel выполнить все вспомогательные функции, которые обычно выполняются методом paintComponent, включая перекрашивание фона (ключ для вашего проекта).Во-вторых, тот, кому вы звоните, не выполняет ни одну из перечисленных выше функций.Поэтому мой совет - избавиться от трейлинга в вашем супер-колле.

1 голос
/ 13 марта 2011

Для этого можно использовать метод repaint().

Если вы используете paintComponent () на панели.Вам следует ИМХО позаботиться о покраске всей панели.В вашем примере нет кода, который позаботится об удалении старых закрашенных прямоугольников.

Я рекомендую создать собственный компонент для ваших прямоугольников.(Вы можете расширить из Компонента), затем вы можете переопределить метод paintComponent этих классов, как вы это делали на своей панели.Потому что Panel должна выступать в качестве компонента контейнера.Не так, как рисование прямоугольников.

Знайте, добавляйте экземпляры этих компонентов в обычную JPanel.Это должно затем обновить как ожидалось.

1 голос
/ 13 марта 2011

Вы можете использовать следующие методы из JComponent: (http://download.oracle.com/javase/6/docs/api/javax/swing/JComponent.html)

void    repaint(long tm, int x, int y, int width, int height)
 Adds the specified region to the dirty region list if the component is showing.
void    repaint(Rectangle r)
 Adds the specified region to the dirty region list if the component is showing.

Вы можете позвонить до redraw()

...