Перекрасить проблему с JPanel внутри другой JPanel - PullRequest
2 голосов
/ 09 марта 2010

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

Мой paintComponent метод подобен этому

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

    for (int i = 0; i < reportElements.size(); i++) {
        this.reportElements.get(i).display((Graphics2D) pageComponents.get(i).getGraphics());

    }
}

Когда родительский элемент - JEditorPane с включенным setEditable(), он работает, и мы можем видеть фигуры, но когда это JPanel, через миллисекунду все, что я вижу, это пустые панели.

Ответы [ 4 ]

3 голосов
/ 09 марта 2010

Вы должны нарисовать объект Graphics в JPanel, чтобы он был постоянным ... В вашем примере это Graphics g ...

2 голосов
/ 09 марта 2010

в этом случае, что происходит с этими Компоненты страницы, маленькие JPanels? родительская панель не будет рисовать формы на них это?

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

Для чего стоит Индивидуальные подходы к рисованию имеет рабочий пример рисования фигур на панели.

2 голосов
/ 09 марта 2010

УльтраДжон мертв. Вам нужно использовать Graphics, который вы прошли. Продолжайте читать, почему ...

Java 1.6 представила RepaintManager, которая поддерживает оптимизацию запросов на перерисовку. Имеет некоторые тонкие эффекты на живопись.

В этом случае вы работаете с несколькими объектами Graphics2D: g передается в paintComponent и значение, возвращаемое вызовом getGraphics.

Менеджер по перекраске передал вам g, на котором можно рисовать. Примечание: это рисует не на экране, а во временном буфере (при условии двойной буферизации по умолчанию).

В вызове paintComponent вы рисуете графику, полученную из getGraphics различных компонентов. Это обходит менеджер перерисовок и рисует прямо на небуферизованный дисплей.

Когда возвращается paintChildren, RepaintManager запускает обновление двойного буфера. Он закрашивает пустой временный буфер над отображаемым буфером, эффективно стирая то, что было нарисовано через графический объект, полученный из getGraphics

0 голосов
/ 09 марта 2010

Возможно, paintChildren или paintBorder переопределяют все, что вы нарисовали в своем методе. Возможно, вместо этого попробуйте переопределить paint. Там у вас есть полный контроль над тем, что будет написано на компоненте, и вы можете сами решить, следует ли вам вообще звонить paintComponent, paintChildren или paintBorder.

...