Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Двойной вызов paintComponent / 19 сообщений из 19, страница 1 из 1
30.08.2012, 11:54:44
    #37936814
_usa__83_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной вызов paintComponent
День добрый!

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

угу, читнем-с
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
11.10.2013, 16:14:31
    #38424655
_usa__83_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной вызов paintComponent
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
11.10.2013, 16:32:43
    #38424680
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной вызов paintComponent
Зачем вам это вообще??? paint вызывается сколько угодно раз в любое удобное время.
Из stacktrace видно, что события приходят из event queue в RepaintManager. А постятся они туда из разных источников. В вашем пример, как показывает дебаг, обе отрисовки прилетают от таймера, который реализует анимацию курсора в текстовом поле. Потом, вероятно, что-то где-то кешируется и глобальный repaint уже не вызывается.
...
Рейтинг: 0 / 0
11.10.2013, 16:40:50
    #38424690
_usa__83_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной вызов paintComponent
Blazkowicz,

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

))
...
Рейтинг: 0 / 0
11.10.2013, 16:48:02
    #38424704
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной вызов paintComponent
Если дампать стэк в 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
11.10.2013, 16:49:16
    #38424705
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной вызов paintComponent
_usa__83_Дык споткнулся однажды

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

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

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

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

Споткнулся однажды: отрисовка занимала достаточно много времени (рисовался график кусочно-линейно, - притормаживало)
Гы. Так отрисовка вообще постоянно делается. Так что это бага реализации. Нужно все расчеты выносить модель, а затем быстро-быстро рисовать модель максимально подготовленную к отрисовке. И все вычисление делать вне paint
...
Рейтинг: 0 / 0
14.10.2013, 17:05:04
    #38426950
_usa__83_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной вызов paintComponent
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
14.10.2013, 17:13:03
    #38426966
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной вызов paintComponent
...
Рейтинг: 0 / 0
14.10.2013, 17:20:21
    #38426980
_usa__83_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной вызов paintComponent
Blazkowicz,

Согласен, адрес прописал не верно, но согласитесь, что описания несколько разнятся все что приватное не описано
...
Рейтинг: 0 / 0
14.10.2013, 17:29:31
    #38426996
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной вызов paintComponent
_usa__83_Согласен, адрес прописал не верно, но согласитесь, что описания несколько разнятся все что приватное не описано
Не могу согласиться с тем чего не доганяю. Если вы дебажить собрались, как я советовал выше, то нужно исходники подключить и их читать, а не JavaDoc.
Если вы исходники читать не можете, то JavaDoc RepainManager-а вам ничем не поможет. Тогда следуйту другому совету - вычислять всё что можно заранее, а не внутри метода paint().
...
Рейтинг: 0 / 0
14.10.2013, 17:33:43
    #38427006
_usa__83_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной вызов paintComponent
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
14.10.2013, 17:36:47
    #38427011
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной вызов paintComponent
Исходники есть src.zip в JDK. Любая адекватная IDE сама подключит их к проекту. Оттуда же IDE умеет показывать JavaDoc.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Двойной вызов paintComponent / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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