i\' m little bit confused about few things:
Example code,that shows my problem,this isn\'t compilable
// image
private Buf
is it good practice to do this
No, this is actually incredibly horrible and error prone. This assumes that this is the Component#getGraphics
method. The problem is Swing uses a passive rendering algorithm, that is, Swing decides when and what should be repainted and does this for optimisation reasons.
This means updates are not regular, which really helps when doing animation, and can happen at any time for any number reasons, many of which you simply don't and can't control.
For these reasons, painting should be done within one of the paint methods, preferably, paintComponent
of a JComponent
based class. This way, when Swing decides to do a repaint, one, you know about it and can update the output accordingly, and two, it won't clear what you have previously painted to it using getGraphics
which could cause flickering...
You are also running into potential threading issues, as you thread is trying to paint to the Graphics
context, so might the Event Dispatching Thread and that isn't going to end pretty...All painting should be done from within the context of the EDT (for component based painting)
You could try using a BufferedStrategy
, which would give you direct control over the painting process, but this limits you to the AWT library. Don't know if this is good or bad in your case.
one other thing, how graphic.dispose() works correctly? , because trying to remove this line of code, nothing happens.
dispose
basically releases any native resources that the Graphics
context might be holding. General rule of thumb, if you didn't create, you don't dispose of it.
So if you use Graphics#create
or BufferedImage#createGraphics
to obtain a Graphics
context, then you should call dispose
when your done with it.
On some systems calling dispose
on the Grpahics
context used to perform painting of components (such as that passed to paintComponent
or obtained from getGraphcis
) can prevent further content from been painted.
Equally, not disposing of Graphics
contexts that you have created can lead to memory leaks as they won't get garbage collected...
There are many questions about "good" or "correct" painting in Swing, so this question could be considered as a duplicate, and I won't try to repeat here what should be read in context, for example, in the Lesson about Performing Custom Painting.
However, to summarize the most important information short and concisely:
getGraphics
on a Component
. It may return null
or a Graphics
object that is in any other way "invalid". It will fail in the one form or the other, sooner or laterpaintComponent
method (or in methods that are called from paintComponent
), using the Graphics
object that you receive there as an argumentGraphics#dispose
method may not make a difference that is "immediately" visible. You should not call it on the one that you received in the paintComponent
. You should only call it on a Graphics
object that you either obtained from a BufferedImage
, or one that you created by calling Graphics#create()
. When you do not call it, this might cause a memory leak that will only be noticed after the application has been running for a while.