2010-03-09 2 views
2

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

Мой 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, после миллисекунды я вижу пустой панели.

+0

Вы попробовали переопределить ** краску (Графика g) ** вместо этого ** paintComponent (Graphics g) **? – Jack

+0

спасибо за предложение jack, но это не проблема. Я думаю, что я пробовал это – Halo

ответ

2

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

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

Для чего стоит Custom Painting Approaches имеет рабочий пример рисования фигур на панели.

+0

Я имею в виду, что мне бы хотелось, чтобы фигуры не были на главной панели, а у детей, так что когда я меняю одна из этих небольших координат JPanels, рисунок также изменит положение, или когда я удалю одну из JPanels, рисунок также распадется (BG-SoA). – Halo

+0

Ну, это именно то, что я описал, метод paintComponent() для каждой дочерней панели настроен. Затем, когда вы добавляете дочернюю панель к родительскому объекту, картина ребенка выполняется автоматически. – camickr

+0

Понимаю, чтобы настроить свою краску, я думаю, мне нужно создать отдельный класс для дочерней панели? Потому что я только что создал объекты JPanel раньше. нет ли ожидания, чтобы это не привело к одной и той же проблеме в первую очередь? – Halo

0

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

+0

. Думаю, я пробовал это, и он не работал. спасибо – Halo

3

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

+0

Я попробую сразу – Halo

+0

, но подождите секунду. в этом случае, что происходит с этими pageComponents, небольшими JPanels? Родительская панель не собирается рисовать фигуры на них? тогда они бесполезны сейчас? – Halo

2

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

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

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

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

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

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

+0

спасибо за объяснение человек, я попробую его после обеда. – Halo

+0

@Devon_C_Miller, в течение секунды я думал, что вы сказали, что я мертв ... :) – ultrajohn

+0

Извините @ultrajohn, моя ошибка! Я был обманут 8-летним RTT на ваших пакетах ;-) –