Почему paintComponent () вызывается несколько раз? - PullRequest
1 голос
/ 18 апреля 2020

Я пытаюсь написать класс, реализующий интерфейс наблюдателя, этот класс dr aws прямоугольников по вертикали в соответствии с входными данными из textField. Все работает нормально, за исключением того, что мои прямоугольники не начинаются с координат (0, 0). Я попытался поместить System.out.print и посмотреть, что происходит, и кажется, что мой paintComponent () вызывается дважды. Я не мог понять, где именно пошло не так. Может кто-нибудь, пожалуйста, помогите мне решить эту проблему? Ниже мой код:

public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        for (int i = 0; i < dm.getData().size(); i++)
        {
            Rectangle2D rectangle = new Rectangle2D.Double(x, y, dm.getDataElement(i), height);
            g2.draw(rectangle);
            System.out.println(i + "th rec drew.");
            y = y + height;
        }
    }

public void update(Observable o, Object arg) {
        // TODO Auto-generated method stub
        repaint();
    }

1 Ответ

2 голосов
/ 18 апреля 2020

Swing GUI живопись никогда не находится под вашим непосредственным контролем. Рисование может быть выполнено, потому что ваша программа запрашивает , что это должно быть сделано, скажем, путем вызова repaint(), и даже это не гарантирует рисования, или потому что операционная система считает, что окно нуждается в перерисовке и направляет его сделать это. Именно по этой причине вам следует избегать помещения лога программы c, кода, изменяющего состояние, такого как y = y + height;, в метод рисования. Поместите это в другое место, скажем, в свой метод update(...) или таймер Swing, а затем пусть метод рисования будет отвечать только за рисование визуального представления состояния вашей программы, а не за его изменение.

Для более подробной информации о это, пожалуйста, прочитайте Живопись в AWT и Swing

...