Beste,
Wat wil ik doen?
ik wil een rechthoek teken op een JPanel en die van links naar rechts laten botsen.
Wat is het probleem?
gewoon, bufferedImage, volatileImage telkens heb ik flickering (oftewel het bovenste stuk van mijn shape, hier rechthoek) staat al x pixels verder dan onderste stuk (omdat het onderste niet op tijd gerefreshed is?).
Wat is mijn vraag?
Ik ben al een week aan het proberen, heb nu eindelijk na veel info te lezen een werkend voorbeeld met volatileImage. Ziet er iemand of er dingen sneller kunnen, of er grote fouten in zitten die het tekenen vertragen? hints?
Dit is mijn code: (er is natuurlijk ook een klasse die een JFrame aanmaakt en de JPanel er aan toevoegt)
Of weet er iemand een andere manier om in Java van die flickering af te geraken?
thanx!
Wat wil ik doen?
ik wil een rechthoek teken op een JPanel en die van links naar rechts laten botsen.
Wat is het probleem?
gewoon, bufferedImage, volatileImage telkens heb ik flickering (oftewel het bovenste stuk van mijn shape, hier rechthoek) staat al x pixels verder dan onderste stuk (omdat het onderste niet op tijd gerefreshed is?).
Wat is mijn vraag?
Ik ben al een week aan het proberen, heb nu eindelijk na veel info te lezen een werkend voorbeeld met volatileImage. Ziet er iemand of er dingen sneller kunnen, of er grote fouten in zitten die het tekenen vertragen? hints?
Dit is mijn code: (er is natuurlijk ook een klasse die een JFrame aanmaakt en de JPanel er aan toevoegt)
Java: VmainPaneel.class
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
| import java.awt.*; import java.awt.event.*; import java.awt.geom.Rectangle2D; import java.awt.image.VolatileImage; import javax.swing.*; public class VmainPaneel extends JPanel implements ActionListener { // image creation final int w = 400; final int h = 400; int richtingSnelheid = 10; int drawImagePosX = 0; VolatileImage vImg = createVolatileImage(w, h); public VmainPaneel(){ renderOffscreen(); // start een timer die 10x/s een actionEvent triggert javax.swing.Timer tijdje = new javax.swing.Timer(1000/10, this); tijdje.start(); } public VolatileImage createVolatileImage(int width, int height) { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration(); VolatileImage image = null; image = gc.createCompatibleVolatileImage(width, height); if (image.validate(gc) == VolatileImage.IMAGE_INCOMPATIBLE) { image = this.createVolatileImage(width, height); return image; } return image; } void renderOffscreen() { do { if (vImg.validate(getGraphicsConfiguration()) == VolatileImage.IMAGE_INCOMPATIBLE){ // old vImg doesn't work with new GraphicsConfig; re-create it vImg = createVolatileImage(w, h); } Graphics2D g = vImg.createGraphics(); // miscellaneous rendering commands... g.setColor(Color.red); Rectangle2D.Double rechtje = new Rectangle2D.Double(20, 20, 250, 550); g.fill(rechtje); g.dispose(); } while (vImg.contentsLost()); } public void paintComponent(Graphics gScreen) { System.out.println("paintComponent gestart"); super.paintComponent(gScreen); do { int returnCode = vImg.validate(getGraphicsConfiguration()); if (returnCode == VolatileImage.IMAGE_RESTORED) { // Contents need to be restored renderOffscreen(); // restore contents } else if (returnCode == VolatileImage.IMAGE_INCOMPATIBLE) { // old vImg doesn't work with new GraphicsConfig; re-create it vImg = createVolatileImage(w, h); renderOffscreen(); } gScreen.drawImage(vImg, drawImagePosX, 0, this); } while (vImg.contentsLost()); System.out.println("paintComponent voltooid"); } public void actionPerformed(ActionEvent e) { /* telkens als de timer dit event triggert, wordt er een repaint opgeroepen. */ System.out.println("timer tik"); //debug // verander de richting als de "blok" de rand raakt if((drawImagePosX >= getWidth() - w) || (drawImagePosX < 0)) { richtingSnelheid *= -1; } // verander de horizontale positie adhv richting en snelheid en repaint drawImagePosX += richtingSnelheid; repaint(); } } |
Of weet er iemand een andere manier om in Java van die flickering af te geraken?
thanx!