problem mit Java Timer

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

  • problem mit Java Timer

    Quellcode

    1. import java.awt.*;
    2. import java.awt.event.*;
    3. import javax.swing.*;
    4. import javax.swing.event.*;
    5. import java.awt.Graphics;
    6. import java.awt.Event;
    7. import java.awt.Font;
    8. import java.awt.Color;
    9. public class TimerTest extends JFrame
    10. {
    11. private int min = 0;
    12. private int sec = 0;
    13. private boolean timer = false;
    14. private JLabel Zeit = new JLabel();
    15. public TimerTest(String title)
    16. {
    17. super(title);
    18. setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    19. int frameWidth = 1280;
    20. int frameHeight = 800;
    21. setSize(frameWidth, frameHeight);
    22. Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    23. int x = 0;
    24. int y = 0;
    25. setLocation(x, y);
    26. Container cp = getContentPane();
    27. cp.setLayout(null);
    28. Zeit.setBounds(518, 532, 260, 148);
    29. Zeit.setText("00:00");
    30. Zeit.setFont(new Font("MS Sans Serif", Font.PLAIN, 103));
    31. cp.add(Zeit);
    32. Action space = new AbstractAction() {
    33. public void actionPerformed(ActionEvent e) {
    34. TimerStartStop();
    35. }
    36. };
    37. Zeit.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"space");
    38. Zeit.getActionMap().put("space", space);
    39. Action r = new AbstractAction() {
    40. public void actionPerformed(ActionEvent e) {
    41. min = 0;
    42. sec = 0;
    43. Zeit.setText("00:00");
    44. }
    45. };
    46. Zeit.getInputMap().put(KeyStroke.getKeyStroke("R"),"r");
    47. Zeit.getActionMap().put("r", r);
    48. setResizable(true);
    49. setVisible(true);
    50. }
    51. public void TimerStartStop()
    52. {
    53. if ( timer == true )
    54. {
    55. timer = false;
    56. }
    57. else
    58. {
    59. timer = true;
    60. Timer();
    61. }
    62. }
    63. public void msWarten(int ms) {
    64. try {
    65. Thread.sleep(ms);
    66. } catch (InterruptedException e) {
    67. }
    68. }
    69. public void Timer()
    70. {
    71. while(timer == true)
    72. {
    73. msWarten(1000);
    74. sec += 1;
    75. if (sec == 60)
    76. {
    77. sec = 0;
    78. min = min + 1;
    79. }
    80. if (Integer.toString(sec).length() < 2)
    81. {
    82. Zeit.setText(min+":0"+sec);
    83. }
    84. else if (Integer.toString(sec).length() == 2)
    85. {
    86. Zeit.setText(min+":"+sec);
    87. }
    88. }
    89. }
    90. public static void main (String[] args) {
    91. new TimerTest("");
    92. }
    93. }
    Alles anzeigen


    Wenn ich dieses Programm laufen lasse, dann kann ich den Timer zwar mit Leertaste starten, jedoch wird die Grafik nicht erneuert, der Timer zählt aber im Hintergrund die Sekunden mit.
    Dann, wenn ich es (ich arbeite mit BlueJ) "manuell", also durch rechtsklicken auf das Objekt und dann TimerStartStop() auswähle, hört der Timer auf zu zählen und zeigt mir die Zeit an.
    Wenn ich jedoch den Timer "manuell" starte, dann wird die Grafik auch erneuert.
    Woran kann das liegen?

    Haggi
  • Wenn ich dein Problem richtig verstanden habe solltest du dir das Thema "Nebenläufigkeit" mal anschauen.
    Die Zeit wird zwar weiter berechnet aber der Timer auf der Oberfläche aktualisiert sich nicht.

    Die Oberfläche läuft in einem eigenem Thread. Wenn du nun noch einen Thread für den Timer erstellst kannst du dir das Ergebnis, nach einer Änderung im Timer, auf die Oberfläche holen.

    Wie gesagt, hoffe hab dein Problem richtig verstanden ;)