JPanel to BufferedImage to JPanel problem
Hi fellow Java GUI coders,
i'm having quite some trouble with the following: I'm coding a "game
table" for a boardgame (mahjongg, not the solitair variant but the
original poker-like game). The table has 4 players, one on each side, so
i have a panel with the discards, etc. on it that is in front of each
player - of course on the opposite side if the user its rotated. So i
thought i'd render it in a BufferedImage and rotate the contents. Works
so far - at least a bit.
My Problem's that i have some code in MahjongPanel that renders my
SeatPanels (containing the discards) to a BufferedImage and gives this
image to the corresponding PaintPanels (a custom panel with overridden
paint() method to draw its BufferedImage). Now i'd like that code to run
whenever swing decides it needs to repaint the mahjongPanel. So i tried
overriding its paint or paintComponent method to also execute my
renderSeat code.
Problem there is: I get tons of funny graphic effects such as the whole
MahjongPanel not beeing properly drawn over what was on my MainFrame (code
for that left out here for readability) before, only partially drawn, etc.
What could that be? Any advice would be greatly appreciated!
CODE (i tried to shrink it as much as i could, sorry if its too much)
1. /*
2. * MahjongPanel.java
3. *
4. * Created on November 10, 2009, 11:43 PM
5. */
6.
7. package GUI;
8.
9.
10. import java.awt.Dimension;
11. import java.awt.Graphics;
12. import java.awt.Graphics2D;
13. import java.awt.image.BufferedImage;
14. import java.io.File;
15. import java.io.IOException;
16. import java.util.Timer;
17. import java.util.TimerTask;
18. import javax.imageio.ImageIO;
19. import javax.swing.JPanel;
20. import org.apache.commons.logging.Log;
21. import org.apache.commons.logging.LogFactory;
22.
23. /**
24. *
25. * @author daddel9
26. */
27. public class MahjongPanel extends javax.swing.JPanel {
28. SeatPanel leftSeat, rightSeat, upSeat;
29. Timer timer;
30. private Log log = LogFactory.getLog(this.getClass());
31.
32.
33. // TODO: TOFIX!!! (ask around) THIS IS THE UGLY WORKAROUND
34. class PollTask extends TimerTask {
35. MahjongPanel mjp;
36. private Log log = LogFactory.getLog(this.getClass());
37.
38. public PollTask(MahjongPanel mjp) {
39. this.mjp=mjp;
40. log.info("created ne polltask with mjp "+mjp);
41. }
42. public void run() {
43. log.info("scheduling seat repaint");
44. mjp.renderSeats();
45. }
46. }
47.
48.
49. /** Creates new form MahjongPanel */
50. public MahjongPanel() {
51. leftSeat = new SeatPanel();
52. rightSeat = new SeatPanel();
53. upSeat = new SeatPanel();
54.
55. initComponents();
56.
57. timer = new Timer(); // UGLY WORKAROUND AGAIN
58. timer.schedule(new PollTask(this), 50, 150);
59. }
60.
61.
62. public void renderSeats() {
63. if (leftPanel != null && leftSeat != null) {
64. leftPanel.setSize(256, 411);
65. rightPanel.setSize(256, 411);
66. upPanel.setSize(411, 256);
67.
68. leftSeat.setSize(256, 411);
69. rightSeat.setSize(256, 411);
70. upSeat.setSize(411, 256);
71. leftSeat.setLocation(0, 0);
72. rightSeat.setLocation(0, 0);
73. upSeat.setLocation(0, 0);
74.
75. leftSeat.setVisible(true);
76. rightSeat.setVisible(true);
77. upSeat.setVisible(true);
78.
79. renderSeat(leftSeat, (PaintPanel) leftPanel, -270, true, true);
80. renderSeat(rightSeat, (PaintPanel) rightPanel, -90, true, false);
81. renderSeat(upSeat, (PaintPanel) upPanel, -180, false, false);
82. }
83. }
84.
85. public void renderSeat(SeatPanel s, PaintPanel p, int rotation, boolean vertical, boolean left) {
86. BufferedImage img = new BufferedImage(p.getWidth(), p.getHeight(), BufferedImage.TYPE_INT_RGB);
87. Graphics2D g2d = (Graphics2D) img.createGraphics();
88.
89. if(vertical) {
90. g2d.rotate(Math.toRadians(rotation));
91. if(left) g2d.translate(0, -256);
92. else g2d.translate(-411, 0);
93. } else {
94. g2d.rotate(Math.toRadians(rotation),p.getWidth()/2,p.getHeight()/2);
95. g2d.translate(-1, 0);
96. }
97.
98. seatPanel.paint(g2d);
99. p.setImg(img);
100. p.repaint(); // WAS COMMENTED IN AND OUT FOR TESTING - SEE BELOW
101. }
102.
103.
104. /* TRIED EVERY PERMUTATION WITH/WITHOUT REPAINT ABOVE
105. @Override
106. public void paint(Graphics arg0) {
107. renderSeats(); // EITHER HERE
108. super.paint(arg0);
109. renderSeats(); // OR HERE
110. }
111. @Override
112. public void paintComponent(Graphics arg0) {
113. renderSeats(); // EITHER HERE
114. super.paintComponent(arg0);
115. renderSeats(); // OR HERE
116. }
117.
118.
119. */
120.
121. private void initComponents() {
122. // GUI GENRATION HAPPENS HERE
123. }
124.
125.
126.
127. // Variables declaration - do not modify
128. private javax.swing.JButton ch
1. *
2. * PaintPanel.java
3. *
4. * Created on November 13, 2009, 11:06 PM
5. */
6.
7. package GUI;
8.
9. import java.awt.Dimension;
10. import java.awt.Graphics;
11. import java.awt.Graphics2D;
12. import java.awt.image.BufferedImage;
13. import org.apache.commons.logging.Log;
14. import org.apache.commons.logging.LogFactory;
15.
16.
17. /**
18. *
19. * @author daddel9
20. */
21. public class PaintPanel extends javax.swing.JPanel {
22. BufferedImage img;
23. private Log log = LogFactory.getLog(this.getClass());
24.
25. /** Creates new form PaintPanel */
26. public PaintPanel() {
27. initComponents();
28. }
29.
30. public void setImg(BufferedImage img) {
31. this.img = img;
32.
33. }
34.
35. @Override
36. public void paint(Graphics g) {
37. if(img != null) {
38. g.drawImage(img, 0, 0, this);
39. }
40. }
41.
42.
43. private void initComponents() {
44. // GUI INIT STUFF
45. }
46.
47.
48. // Variables declaration - do not modify
49. // End of variables declaration
50.
51. }
52.
1. /*
2. * SeatPanel.java
3. *
4. * Created on November 11, 2009, 12:16 AM
5. */
6.
7. package GUI;
8.
9. import java.awt.Graphics;
10. import org.apache.commons.logging.Log;
11. import org.apache.commons.logging.LogFactory;
12.
13. /**
14. *
15. * @author daddel9
16. */
17. public class SeatPanel extends javax.swing.JPanel {
18.
19. private Log log = LogFactory.getLog(this.getClass());
20.
21. /** Creates new form SeatPanel */
22. public SeatPanel() {
23. initComponents();
24. }
25.
26. @Override
27. public void paint(Graphics arg0) {
28. super.paint(arg0);
29. }
30.
31.
32.
33.
34. private void initComponents() {
35. // GUI INIT
36. }
37.
38. // Variables declaration - do not modify
39. private GUI.CallPanel callPanel1;
40. private GUI.DiscardPanel discardPanel1;
41. // End of variables declaration
42.
43. }
44.