bei eigenem dialogelement zwischen 2 repaint() warten und größe neu berechnen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • bei eigenem dialogelement zwischen 2 repaint() warten und größe neu berechnen

    hiho

    also ich habe mir jetzt ein eigenes dialogelement erstellt.
    es soll eine led anzeige bereitstellen, die die zahlen 0-9 anzeigen kann, oder einfach leer ist.
    desweiteren ist es in 3 ringe unterteilt, die jeder getrennt für eine bestimmte zeit aufblinken sollen.

    soweit funktioniert auch alles, bis auf 2 sachen:
    die zahlen haben eine unterschiedliche breite, d.h. es sind auch unterschiedlich viele leds. wenn jetzt eine zahl schmaler ist, als die vorher angezeigte, habe ich an der rechten seite einen schwarzen rand. andersrum genauso. ist die nächste zahl breiter, wird nichtz alles angezeigt.
    gibt es eine möglichkeit, dem layoutmanager zu sagen, dass er die größe neu berechnen soll? oder andere vorgehensweisen, die das problem beheben? ich wollte die größe nämlich so lassen, wegen der symmetrie ;)

    das 2 problem ist die methode zum blinken. sie soll den jeweiligen ring anzeigen, und dann eine bestimmte zeit warten. das habe ich mit

    Quellcode

    1. wait(millies)

    versucht, aber ich bekomme immer eine IllegalMonitorStateException.
    was mache ich falsch?

    und vllt kann mir jemand den ein oder anderen tipp geben, was ichs onst anders/besser machen kann (vllt der 3d array), aber muss nicht unbedingt sein :)

    mfg und danke schon mal für die mühe



    Quellcode

    1. package PingPong;
    2. import java.awt.Canvas;
    3. import java.awt.Color;
    4. import java.awt.Container;
    5. import java.awt.Dimension;
    6. import java.awt.FlowLayout;
    7. import java.awt.Graphics;
    8. import java.awt.event.ActionEvent;
    9. import java.awt.event.ActionListener;
    10. import java.security.InvalidParameterException;
    11. import javax.swing.JButton;
    12. import javax.swing.JFrame;
    13. import javax.swing.WindowConstants;
    14. /**
    15. * This class provides a LED display.
    16. * It can show any number from 0 till 9 or an empty display.
    17. *
    18. * @author
    19. * @version 1.0.1
    20. */
    21. public class Leds extends Canvas{
    22. public static final long serialVersionUID = 3242345986745L;
    23. private final int HEIGHT = 7;
    24. private final int LEDSIZE = 25;
    25. public final static int OUTER_RING = 0;
    26. public final static int MIDDLE_RING = 1;
    27. public final static int INNER_RING = 2;
    28. private final Color OFFCOLOR = new Color(0,0,100);
    29. private final Color ONCOLOR = new Color(0,0,255);
    30. private final Color BGCOLOR = new Color(0,0,40);
    31. private int number;
    32. // number of leds for each number
    33. private int[] width = {6,6,6,6,6,4,5,5,5,5,5,5,5,5};
    34. // defines whether a led is on or off
    35. private int[][][] numbers = {
    36. { //outer ring
    37. {1,1,1,1,1,1}, //row 0
    38. {1,0,0,0,0,1}, //row 1
    39. {1,0,0,0,0,1}, //row 2
    40. {1,0,0,0,0,1}, //row 3
    41. {1,0,0,0,0,1}, //row 4
    42. {1,0,0,0,0,1}, //row 5
    43. {1,1,1,1,1,1} //row 6
    44. },
    45. { //middle ring
    46. {0,0,0,0,0,0}, //row 0
    47. {0,1,1,1,1,0}, //row 1
    48. {0,1,0,0,1,0}, //row 2
    49. {0,1,0,0,1,0}, //row 3
    50. {0,1,0,0,1,0}, //row 4
    51. {0,1,1,1,1,0}, //row 5
    52. {0,0,0,0,0,0} //row 6
    53. },
    54. { //inner ring
    55. {0,0,0,0,0,0}, //row 0
    56. {0,0,0,0,0,0}, //row 1
    57. {0,0,1,1,0,0}, //row 2
    58. {0,0,1,1,0,0}, //row 3
    59. {0,0,1,1,0,0}, //row 4
    60. {0,0,0,0,0,0}, //row 5
    61. {0,0,0,0,0,0} //row 6
    62. },
    63. { //nothing
    64. {0,0,0,0,0,0}, //row 0
    65. {0,0,0,0,0,0}, //row 1
    66. {0,0,0,0,0,0}, //row 2
    67. {0,0,0,0,0,0}, //row 3
    68. {0,0,0,0,0,0}, //row 4
    69. {0,0,0,0,0,0}, //row 5
    70. {0,0,0,0,0,0} //row 6
    71. },
    72. { //zero
    73. {0,0,0,0,0,0}, //row 0
    74. {0,0,1,1,0,0}, //row 1
    75. {0,1,0,0,1,0}, //row 2
    76. {0,1,0,0,1,0}, //row 3
    77. {0,1,0,0,1,0}, //row 4
    78. {0,0,1,1,0,0}, //row 5
    79. {0,0,0,0,0,0} //row 6
    80. },
    81. { //one
    82. {0,0,0,0}, //row 0
    83. {0,0,1,0}, //row 1
    84. {0,1,1,0}, //row 2
    85. {0,0,1,0}, //row 3
    86. {0,0,1,0}, //row 4
    87. {0,0,1,0}, //row 5
    88. {0,0,0,0} //row 6
    89. },
    90. { //two
    91. {0,0,0,0,0}, //row 0
    92. {0,1,1,1,0}, //row 1
    93. {0,0,0,1,0}, //row 2
    94. {0,0,1,1,0}, //row 3
    95. {0,1,0,0,0}, //row 4
    96. {0,1,1,1,0}, //row 5
    97. {0,0,0,0,0}, //row 6
    98. },
    99. { //three
    100. {0,0,0,0,0}, //row 0
    101. {0,1,1,1,0}, //row 1
    102. {0,0,0,1,0}, //row 2
    103. {0,1,1,0,0}, //row 3
    104. {0,0,0,1,0}, //row 4
    105. {0,1,1,1,0}, //row 5
    106. {0,0,0,0,0}, //row 6
    107. },
    108. { //four
    109. {0,0,0,0,0}, //row 0
    110. {0,1,0,1,0}, //row 1
    111. {0,1,0,1,0}, //row 2
    112. {0,1,1,1,0}, //row 3
    113. {0,0,0,1,0}, //row 4
    114. {0,0,0,1,0}, //row 5
    115. {0,0,0,0,0}, //row 6
    116. },
    117. { //five
    118. {0,0,0,0,0}, //row 0
    119. {0,1,1,1,0}, //row 1
    120. {0,1,0,0,0}, //row 2
    121. {0,1,1,0,0}, //row 3
    122. {0,0,0,1,0}, //row 4
    123. {0,1,1,1,0}, //row 5
    124. {0,0,0,0,0}, //row 6
    125. },
    126. { //six
    127. {0,0,0,0,0}, //row 0
    128. {0,0,1,1,0}, //row 1
    129. {0,1,0,0,0}, //row 2
    130. {0,1,1,1,0}, //row 3
    131. {0,1,0,1,0}, //row 4
    132. {0,1,1,1,0}, //row 5
    133. {0,0,0,0,0}, //row 6
    134. },
    135. { //seven
    136. {0,0,0,0,0}, //row 0
    137. {0,1,1,1,0}, //row 1
    138. {0,0,0,1,0}, //row 2
    139. {0,0,1,0,0}, //row 3
    140. {0,1,0,0,0}, //row 4
    141. {0,1,0,0,0}, //row 5
    142. {0,0,0,0,0}, //row 6
    143. },
    144. { //eight
    145. {0,0,0,0,0}, //row 0
    146. {0,1,1,1,0}, //row 1
    147. {0,1,0,1,0}, //row 2
    148. {0,0,1,0,0}, //row 3
    149. {0,1,0,1,0}, //row 4
    150. {0,1,1,1,0}, //row 5
    151. {0,0,0,0,0}, //row 6
    152. },
    153. { //nine
    154. {0,0,0,0,0}, //row 0
    155. {0,1,1,1,0}, //row 1
    156. {0,1,0,1,0}, //row 2
    157. {0,1,1,1,0}, //row 3
    158. {0,0,0,1,0}, //row 4
    159. {0,1,1,0,0}, //row 5
    160. {0,0,0,0,0}, //row 6
    161. }
    162. };
    163. /**
    164. * Paints LEDs viewing a number.
    165. *
    166. * @param number
    167. * 0-9 for number or -1 for empty display.
    168. */
    169. public Leds(int number){
    170. if(number >= -1 && number <= 9){
    171. this.number = number+4;
    172. }
    173. else{
    174. new InvalidParameterException("number exceeds the range of values");
    175. }
    176. }
    177. public Dimension getPreferredSize(){
    178. return new Dimension((2*(width[number])+1) + (width[number]*LEDSIZE), ((2*7)+1) + (7*LEDSIZE)); // size of display
    179. }
    180. public Dimension getMaximumSize(){
    181. return new Dimension((2*(width[number])+1) + (width[number]*LEDSIZE), ((2*7)+1) + (7*LEDSIZE)); // size of display
    182. }
    183. public Dimension getMinimumSize(){
    184. return new Dimension((2*(width[number])+1) + (width[number]*LEDSIZE), ((2*7)+1) + (7*LEDSIZE)); // size of display
    185. }
    186. /**
    187. * Paints a display with LEDs viewing a number.
    188. *
    189. * @param g
    190. * Graphics to paint.
    191. */
    192. public void paint(Graphics g){
    193. //background
    194. g.setColor(BGCOLOR);
    195. g.fillRect(0,0,getSize().width,getSize().height); // paints the background
    196. //LEDs
    197. for(int i = 0, y = 2; i < HEIGHT; i++){ // row 1-7
    198. for(int j = 0, x = 2; j < width[number]; j++){ // leds for each row
    199. if(numbers[number][i][j] == 0){ g.setColor(OFFCOLOR); }
    200. else{ g.setColor(ONCOLOR); }
    201. g.fillOval(x, y, LEDSIZE, LEDSIZE);
    202. x += LEDSIZE+2;
    203. }
    204. y += LEDSIZE+2;
    205. }
    206. }
    207. /**
    208. * Returns the current shown number.
    209. *
    210. * @return number
    211. * 0-9 for number or -1 for empty display.
    212. */
    213. public int getNumber(){
    214. return number-4;
    215. }
    216. /**
    217. * Sets the number should be shown by the display.
    218. *
    219. * @param number
    220. * 0-9 for number or -1 for empty display.
    221. */
    222. public void setNumber(int number){
    223. if(number >= -1 && number <= 9){
    224. this.number = number+4;
    225. }
    226. else{
    227. new InvalidParameterException("number exceeds the range of values");
    228. }
    229. repaint();
    230. }
    231. /**
    232. * The ring ring flashes for a time.
    233. *
    234. * @param ring
    235. * one of constants OUTER_RING, MIDDEL_RING, INNER_RING.
    236. *
    237. * @param millies
    238. * Time in milliseconds.
    239. *
    240. * @throws InterruptedException
    241. */
    242. public void flash(int ring, int millies) throws InterruptedException{
    243. this.number = ring;
    244. repaint();
    245. this.wait(millies);
    246. this.number = -1;
    247. repaint();
    248. }
    249. /**
    250. * Main method.
    251. *
    252. * @param args
    253. * Arguments to pass.
    254. */
    255. public static void main(String[] args){
    256. JFrame f = new JFrame("Test");
    257. f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    258. Container c = f.getContentPane();
    259. c.setLayout(new FlowLayout());
    260. for(int i = 0; i <= 9; i++){
    261. c.add(new Leds(i));
    262. }
    263. final Leds blinkLeds = new Leds(-1);
    264. c.add(blinkLeds);
    265. JButton button1 = new JButton("count");
    266. button1.addActionListener(new ActionListener(){
    267. public void actionPerformed(ActionEvent e){
    268. int count = blinkLeds.getNumber();
    269. if(count < 9){
    270. count++;
    271. }
    272. else{
    273. count = -1;
    274. }
    275. blinkLeds.setNumber(count);
    276. }
    277. });
    278. JButton button2 = new JButton("blink");
    279. button2.addActionListener(new ActionListener(){
    280. public void actionPerformed(ActionEvent e){
    281. try {
    282. blinkLeds.flash(OUTER_RING, 1000);
    283. wait(500);
    284. blinkLeds.flash(MIDDLE_RING, 1000);
    285. wait(500);
    286. blinkLeds.flash(INNER_RING, 1000);
    287. } catch (InterruptedException e1) {
    288. e1.printStackTrace();
    289. }
    290. }
    291. });
    292. c.add(button1);
    293. c.add(button2);
    294. f.pack();
    295. f.setVisible(true);
    296. }
    297. }
    Alles anzeigen
    contest
    -- Ein Wettnewerb für Jugendliche Programmierer --
    Jeder Helfer ist willkommen ;)
  • ok für das problem mit wait ist mir was eingefallen:
    ich habe ja konstanten für die ringe, die ich dann einfach in die methode setNumber() mit einbaue. dann noch ein paar kleien änderungen bezüglich der namensgebung, und das sollte funktionieren.
    so ist der berührungspunkt der klasse kleiner und die sache mit wait() kann bei der implementierung festgelegt werden ;)

    edith: mir ist grad eingefallen, dass ich warscheinlich nicht wait() sondern sleep() hätte verwenden müssen. aber ist ja eh egal jetzt :)

    nur für das andere problem ist mir leider noch nichts eingefallen. ich hab schon probiert invalidate() und danach validate() aufzurufen, aber das hilft leider nicht...

    mfg
    contest
    -- Ein Wettnewerb für Jugendliche Programmierer --
    Jeder Helfer ist willkommen ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von DarthMaul ()

  • ich bins mal wieder.
    das 2 problem hab ich nu auch gelöst bekommen ;):
    ich hab in der paint methode zu anfang die größe einfach neu berechnet, also wo der hintergrund gezeichnet wird

    Quellcode

    1. //background
    2. g.setColor(BGCOLOR);
    3. g.fillRect(0,0,computeSize().width, computeSize().height); // paints the background
    4. private Dimension computeSize(){
    5. return new Dimension((2*(width[number])+1) + (width[number]*LEDSIZE), ((2*7)+1) + (7*LEDSIZE));
    6. }


    allerdings funktioniert das mit dem thread doch noch nicht. ich hab das entsprechend geändert, und jetzt passiert einfach gar nichts, bis ich nach ablauf der schleife die letzte einstellung angezeigt bekomme, also den inneren ring. hier der entsprechende quellcode:

    Quellcode

    1. JButton button2 = new JButton("blink");
    2. button2.addActionListener(new ActionListener(){
    3. public void actionPerformed(ActionEvent e){
    4. try {
    5. for(int i = 0; i <= 10; i++){
    6. blinkLeds.setNumber(OUTER_RING);
    7. Thread.sleep(100);
    8. blinkLeds.setNumber(MIDDLE_RING);
    9. Thread.sleep(100);
    10. blinkLeds.setNumber(INNER_RING);
    11. Thread.sleep(100);
    12. }
    13. } catch (InterruptedException e1) {
    14. e1.printStackTrace();
    15. }
    16. }
    17. });
    18. c.add(button2);
    Alles anzeigen


    mfg und sry für die ganzen posts
    contest
    -- Ein Wettnewerb für Jugendliche Programmierer --
    Jeder Helfer ist willkommen ;)