powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Двойной вызов paintComponent
19 сообщений из 19, страница 1 из 1
Двойной вызов paintComponent
    #37936814
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый!

Простейший случай: кладу на JFrame экземпляр модифицированного JPanel с переопределенным paintComponent ...
Почему-то он вызывается дважды ... Так должно быть ?
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #37936838
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему бы и нет? Может с layout-ом что-то. Сравните по stacktrace оба вызова.
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #37936851
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

угу, читнем-с
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Двойной вызов paintComponent
    #38424655
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
package test;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class PKE extends JPanel
{
	private static final long serialVersionUID = -4054967406444852236L;
	private int i=0;
	private long ms=System.currentTimeMillis();
	
	public static void main(String[] args) 
	{
	 SwingUtilities.invokeLater(new Runnable() 
	 {
			@Override
			public void run() 
			{
				showGUI();	
			}
	 });
	}

	public static void showGUI()
	{
		JFrame f=new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		PKE p=new PKE();
		p.setPreferredSize(new Dimension(400,600));
		//p.setLayout(new BorderLayout());
		JTextArea jta=new JTextArea();
		jta.setPreferredSize(new Dimension(300,500));
		p.add(jta);
		f.setContentPane(p);
		f.pack();
		f.setVisible(true);
	}

	@Override
	protected void paintComponent(Graphics arg0) 
	{
		super.paintComponent(arg0);
		JTextArea ta=(JTextArea)getComponent(0);		
		ta.append("[Invocation # "+i+"] [delay in ms:"+(System.currentTimeMillis()-ms)+"]\n");
		ms=System.currentTimeMillis();
		i++;
	}
}


Такой код дает двойной вызов при старте, ресайзе, но при minimize-maximize вызывается единожды. Если снять коммент, то модифицированный JPanel вообще не вызывает paintComponent, - очевидно, что его полностью закрывает JTextArea. В стектрэйсе
два идентичных блока ...
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #38424680
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем вам это вообще??? paint вызывается сколько угодно раз в любое удобное время.
Из stacktrace видно, что события приходят из event queue в RepaintManager. А постятся они туда из разных источников. В вашем пример, как показывает дебаг, обе отрисовки прилетают от таймера, который реализует анимацию курсора в текстовом поле. Потом, вероятно, что-то где-то кешируется и глобальный repaint уже не вызывается.
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #38424690
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Дык споткнулся однажды, решил, что данное явление не есть следствие особенностей swing ... ну да раз так, то пусть будет ...
Пасиба ...
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #38424694
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, нет. Не только в таймере дело. В общем надо дебажить RepaintManager, чтобы увидеть кто два раза сабмитит события.
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #38424698
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

))
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #38424704
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если дампать стэк в RepaintManager, то вот два последних стэка от событий, которые приводят к вызову paintComponent

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
java.lang.Exception: Stack trace
	at java.lang.Thread.dumpStack(Thread.java:1249)
	at javax.swing.RepaintManager.scheduleProcessingRunnable(RepaintManager.java:1368)
	at javax.swing.RepaintManager.nativeAddDirtyRegion(RepaintManager.java:548)
	at javax.swing.SwingPaintEventDispatcher.createPaintEvent(SwingPaintEventDispatcher.java:45)
	at sun.awt.windows.WComponentPeer.postPaintIfNecessary(WComponentPeer.java:747)
	at sun.awt.windows.WComponentPeer.handlePaint(WComponentPeer.java:742)
	at sun.java2d.d3d.D3DScreenUpdateManager.repaintPeerTarget(D3DScreenUpdateManager.java:274)
	at sun.java2d.d3d.D3DScreenUpdateManager.createScreenSurface(D3DScreenUpdateManager.java:175)
	at sun.awt.windows.WComponentPeer.replaceSurfaceData(WComponentPeer.java:392)
	at sun.awt.windows.WComponentPeer.createBuffers(WComponentPeer.java:858)
	at java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3811)
	at java.awt.Component$FlipBufferStrategy.<init>(Component.java:3751)
	at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Component.java:4274)
	at java.awt.Component.createBufferStrategy(Component.java:3633)
	at java.awt.Window.createBufferStrategy(Window.java:3019)
	at javax.swing.BufferStrategyPaintManager$BufferInfo.createBufferStrategy(BufferStrategyPaintManager.java:846)
	at javax.swing.BufferStrategyPaintManager$BufferInfo.createBufferStrategy(BufferStrategyPaintManager.java:797)
	at javax.swing.BufferStrategyPaintManager$BufferInfo.getBufferStrategy(BufferStrategyPaintManager.java:730)
	at javax.swing.BufferStrategyPaintManager.prepare(BufferStrategyPaintManager.java:506)
	at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:264)
	at javax.swing.RepaintManager.paint(RepaintManager.java:1225)
	at javax.swing.JComponent.paint(JComponent.java:1015)
	at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
	at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
	at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
	at java.awt.Container.paint(Container.java:1778)
	at java.awt.Window.paint(Window.java:3379)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:797)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
	at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:694)
	at javax.swing.RepaintManager.access$700(RepaintManager.java:41)
	at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1636)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:646)
	at java.awt.EventQueue.access$000(EventQueue.java:84)
	at java.awt.EventQueue$1.run(EventQueue.java:607)
	at java.awt.EventQueue$1.run(EventQueue.java:605)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:616)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
java.lang.Exception: Stack trace
	at java.lang.Thread.dumpStack(Thread.java:1249)
	at PKE.paintComponent(PKE.java:45)
	at javax.swing.JComponent.paint(JComponent.java:1029)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paintToOffscreen(JComponent.java:5131)
	at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
	at javax.swing.RepaintManager.paint(RepaintManager.java:1225)
	at javax.swing.JComponent.paint(JComponent.java:1015)
	at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
	at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
	at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
	at java.awt.Container.paint(Container.java:1778)
	at java.awt.Window.paint(Window.java:3379)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:797)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
	at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:694)
	at javax.swing.RepaintManager.access$700(RepaintManager.java:41)
	at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1636)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:646)
	at java.awt.EventQueue.access$000(EventQueue.java:84)
	at java.awt.EventQueue$1.run(EventQueue.java:607)
	at java.awt.EventQueue$1.run(EventQueue.java:605)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:616)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
java.lang.Exception: Stack trace
	at java.lang.Thread.dumpStack(Thread.java:1249)
	at javax.swing.RepaintManager.scheduleProcessingRunnable(RepaintManager.java:1368)
	at javax.swing.RepaintManager.scheduleProcessingRunnable(RepaintManager.java:1364)
	at javax.swing.RepaintManager.addDirtyRegion0(RepaintManager.java:443)
	at javax.swing.RepaintManager.addDirtyRegion(RepaintManager.java:483)
	at javax.swing.RepaintManager.scheduleHeavyWeightPaints(RepaintManager.java:517)
	at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1633)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:646)
	at java.awt.EventQueue.access$000(EventQueue.java:84)
	at java.awt.EventQueue$1.run(EventQueue.java:607)
	at java.awt.EventQueue$1.run(EventQueue.java:605)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:616)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
java.lang.Exception: Stack trace
	at java.lang.Thread.dumpStack(Thread.java:1249)
	at PKE.paintComponent(PKE.java:45)
	at javax.swing.JComponent.paint(JComponent.java:1029)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paintToOffscreen(JComponent.java:5131)
	at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
	at javax.swing.RepaintManager.paint(RepaintManager.java:1225)
	at javax.swing.JComponent.paint(JComponent.java:1015)
	at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
	at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
	at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
	at java.awt.Container.paint(Container.java:1778)
	at java.awt.Window.paint(Window.java:3379)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:797)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
	at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:694)
	at javax.swing.RepaintManager.access$700(RepaintManager.java:41)
	at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1636)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:646)
	at java.awt.EventQueue.access$000(EventQueue.java:84)
	at java.awt.EventQueue$1.run(EventQueue.java:607)
	at java.awt.EventQueue$1.run(EventQueue.java:605)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:616)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


Далее почитать исходники Swing и AWT предлагаю самостоятельно по вышеуказаным классам.
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #38424705
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_usa__83_Дык споткнулся однажды

На чем? На том что модель менялась в отрисовке? Так надо отображение от состояние отделять.

_usa__83_, решил, что данное явление не есть следствие особенностей swing ... ну да раз так, то пусть будет ...
Пасиба ...
Какое явление? В чем проблема? Может Swing отрендерил два раза, и больше не париться, так как картинка не меняется.
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #38424831
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Споткнулся однажды: отрисовка занимала достаточно много времени (рисовался график кусочно-линейно, - притормаживало)
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #38424834
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Ткнулся в paintComponent оценить время и увидел двойной вызов
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #38424844
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_usa__83_Blazkowicz,

Споткнулся однажды: отрисовка занимала достаточно много времени (рисовался график кусочно-линейно, - притормаживало)
Гы. Так отрисовка вообще постоянно делается. Так что это бага реализации. Нужно все расчеты выносить модель, а затем быстро-быстро рисовать модель максимально подготовленную к отрисовке. И все вычисление делать вне paint
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #38426950
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Э-э-э-э ... Следовал Вашей рекомендации и что-т совсем плохо стало ...

http://www.cs.rit.edu/usr/local/pub/swm/jdoc6/javax/swing/RepaintManager.html ... есть описание вложенных классов
http://docs.oracle.com/javase/7/docs/api/ ... а здесь нет
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #38426966
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #38426980
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Согласен, адрес прописал не верно, но согласитесь, что описания несколько разнятся все что приватное не описано
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #38426996
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_usa__83_Согласен, адрес прописал не верно, но согласитесь, что описания несколько разнятся все что приватное не описано
Не могу согласиться с тем чего не доганяю. Если вы дебажить собрались, как я советовал выше, то нужно исходники подключить и их читать, а не JavaDoc.
Если вы исходники читать не можете, то JavaDoc RepainManager-а вам ничем не поможет. Тогда следуйту другому совету - вычислять всё что можно заранее, а не внутри метода paint().
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #38427006
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Немного ушли в сторону, но все же в "javaDoc" который на http://docs.oracle.com/javase/7/docs/api/javax/swing/RepaintManager.html
нет описания вложенных классов (к примеру) а на http://www.cs.rit.edu/usr/local/pub/swm/jdoc6/javax/swing/RepaintManager.html есть таковые, собственно
туда пошел из-за дампа, смотрел описание классов, ну а так пытаюсь осязать исходники на
http://kickjava.com/src/javax/swing/RepaintManager.java.htm ... Вот собственно
...
Рейтинг: 0 / 0
Двойной вызов paintComponent
    #38427011
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходники есть src.zip в JDK. Любая адекватная IDE сама подключит их к проекту. Оттуда же IDE умеет показывать JavaDoc.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Двойной вызов paintComponent
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]