Wie repaint() bei Uhr realisieren?

zodiac

Mitglied
Hallo,
ich möchte im Wesentlichen ein Applet schreiben, indem die Uhrzeit angezeigt werden, diese soll natürlich sekündlich aktualisiert werden.

Wie mache ich das am besten? Ressurcensparend? Mit Thread.sleep(int time)? Wenn ja, wie lange soll das Programm immer schlafen? genau 1s? Ist das so genau oder muss ich die Zeit immer wieder neu auslesen?

Danke
ZodiaC
 
G

Gelöschtes Mitglied 20545

Gast
In dem Zusammenhang würde mich interessieren, ob Timer oder Thread "sicherer" und welcher performanter ist und welche Risiken ein Thread birgt.
Hier bei SUN sagen sie lediglich, dass Threads "ganz okay" sind, wenn man sich an die Regeln hält...ahja.
 
Zuletzt bearbeitet von einem Moderator:

Landei

Top Contributor
Thread ist schon OK, aber wenn du Swing nimmst, gibt es extra die Klasse javax.swing.Timer (nicht zu verwechseln mit java.util.Timer). JavaDoc sagt:
The javax.swing.Timer has two features that can make it a little easier to use with GUIs. First, its event handling metaphor is familiar to GUI programmers and can make dealing with the event-dispatching thread a bit simpler. Second, its automatic thread sharing means that you don't have to take special steps to avoid spawning too many threads. Instead, your timer uses the same thread used to make cursors blink, tool tips appear, and so on.

Siehe auch: How to Use Swing Timers (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features)

Timer gehen nicht immer genau, deshalb würde ich ihn vielleicht 5-mal pro Sekunde laufen lassen, und einfach nur repaint() aufrufen. Die Zeitabfrage machst du einfach in paintComponent. Solange du keine Kunstwerke zeichnest, sind die überzähligen repaints kaum der Rede wert.
 

slawaweis

Bekanntes Mitglied
1s sleep wäre hier zu ungenau. Man muss einen Thread laufen lassen, der in weniger als eine Sekunde die aktuelle Zeit über System.currentTimeMillis() prüft. Z.B. prüft man alle 200 Millisekunden die Differenz zwischen currentTimeMillis und einem vorher gespeicherten Wert, ob inzwischen eine Sekunde vergangen ist. Wenn das passiert, wird in einem anderen Thread das Repaint durchgeführt. Dabei muss der Zeit-Thread unabhängig von der GUI laufen und entweder darauf warten, noch dadurch blockiert werden, wenn sich z.B. die Repaint-Befehle stapeln, weil das UI irgendwas anderes macht.

Slawa
 

zodiac

Mitglied
Und wie aktualisiere ich date?

Ich habe jetzt

Date date = new Date();

Das ist aber keine Referenz auf Datum; sondern eine feste Zeit. Soll ich jetzt immer wieder
new Date() aufrufen?
 
S

SlaterB

Gast
wenn du die aktuelle Uhrzeit brauchst, dann musst du auf diese Weise ein Date-Objekt erzeugen, richtig,

-----

noch zur Warte-Thread-Optimierung: 200ms warten kann unschön sein,
mit Pech aktualisiert man die Zeit mal genau zum Sekunden Wechsel, mal erst erst nach 1.199 sec und dann wieder nach 0.801 sec,
das kann bereits ein bemerkbares Flackern sein, bis zu 50% Unterschied,
wenn dann auf 50ms Wartezeit runter gehen,

oder rechnen: ein Thread der die aktuelle Zeit kennt, die Zeit bis zum nächsten Update (+ bisschen drüber) und dann die Differenz lang schläft, meist 900+ ms,
das erzeugt die wenigste Arbeit und ist auch am genauesten
 

Andi_CH

Top Contributor
noch zur Warte-Thread-Optimierung: 200ms warten kann unschön sein,
mit Pech aktualisiert man die Zeit mal genau zum Sekunden Wechsel, mal erst erst nach 1.199 sec und dann wieder nach 0.801 sec,

So wie ich es verstehe ist deine Überlegung falsch - wenn der Thread es wirklich 1mS vor dem Wechsel versucht, erfolgt doch der erfolgreiche update 199mS nach der Sekunde.
0.2 Sekunden unschärfe sind schon nicht mehr so schlimm ....

Mache ich einen Überlegungsfehler?

Aber meine eigentliche Frage - gibt es wirklich keine (eventuell plattformspezifische) Möglichkeit einen Thread durch die Uhr wecken zu lassen? So im Stil von waitUntil(12:00); goto Eat;
Na ja, dass das alte goto auch wieder mal zu Ehren kommt :D

(Klar, für grössere Zeiträume kann ich ja ausrechnen wie lange ich schlafen muss, bis ich essen gehen darf ;-) )

En Guete / Mahlzeit
Andi

[EDIT] Dakommt mir noch eine Idee:
Java:
int pausenLänge = rechnenWieLangeEsNochDauert(); // vielleicht etwas weniger lange
Schlafen(pausenLänge);
while (zeitNochNichtUm()) {
    ganzKurzePause();
}
neueZeitdarstellen();
 
Zuletzt bearbeitet:
S

SlaterB

Gast
1.199, also "199mS nach der Sekunde" habe doch auch geschrieben?
0.2 sind schon schlimm und wie gesagt ist im Extremfall das nächse Update extrem pünktlich -> nach 0.8 sec, zwischen 0.8 und 1.2 sind es 0.4 Unterschied,
theoretisch kann das die ganze Zeit so weitergehen, immer 1.2 sec, 0.8, 1.2, 0.8...

> waitUntil(12:00);

dass man ausrechnen kann wie lange zu schlafen ist beschreibe ich ja gerade,
ob es in der API vorgegeben ist kann ich nicht sagen

> Dakommt mir noch eine Idee:

Copyright, meine Idee ;)
 

Andi_CH

Top Contributor
-> Dann habe ich deine Aussage "mal erst erst nach 1.199 sec" falsch interpretiert.

Copyright: Meine Kollegen aus der französischen Schweiz würden jetzt sagen: "Asch das copyright lass isch disch" ;-) (tönt richtig sympatisch) (Die Idee ist in Umkehrung eines Taskswitching Verfahrens das wir vor einige Zeit mal besprochen haben (wahr vor zwei Jahren im Nachdip-Studium) bei dem Prozesse nach irgendwelchen Kriterien progressiv mehr Rechenzeit bekommen)

Mit sleepUntil(12:00) meine ich natürlich dass der Thread genau um 12:00 von der Uhr geweckt wird und nicht ein verkapptes "sleep(12:00-now())"
 
G

Gelöschtes Mitglied 20545

Gast
Calendar.get(Calender.HOUR_OF_DAY) oder nur HOUR, wenn die Stunde seit 0:00 bzw. 12:00 gesucht wird.
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Wenn ich repaint(); mache, flackert es so stark, das man fast nichts erkennen kann. Java Basics - Anfänger-Themen 11
S Repaint() Java Basics - Anfänger-Themen 1
J Erste Schritte Mit repaint() ist Label nicht sichtbar Java Basics - Anfänger-Themen 15
S Repaint() in der Schleife funktioniert nicht immer Java Basics - Anfänger-Themen 5
H Graphics / repaint Java Basics - Anfänger-Themen 8
D Verhindern das repaint beim vergrößern aufgerufen wird Java Basics - Anfänger-Themen 9
M Liste mit repaint aktualisieren Java Basics - Anfänger-Themen 1
E Probleme mit repaint() Java Basics - Anfänger-Themen 15
K Erkennt repaint nicht Java Basics - Anfänger-Themen 1
S KeyListener/ActionListener/paint()/repaint() Java Basics - Anfänger-Themen 3
1 repaint() Funktion erzeugt Flackern Java Basics - Anfänger-Themen 33
I Anfängerfrage JPanel repaint() Java Basics - Anfänger-Themen 6
A externer repaint Aufruf Java Basics - Anfänger-Themen 9
G Problem mit repaint() Java Basics - Anfänger-Themen 2
J repaint() geht gar nicht; GUI aktualisieren Java Basics - Anfänger-Themen 10
J paint() vs repaint() Java Basics - Anfänger-Themen 3
C repaint wird nicht während Druck auf Maustaste ausgeführt. Java Basics - Anfänger-Themen 4
A Methoden repaint() zeichnet JPanel falsch Java Basics - Anfänger-Themen 3
P [JTable] Problem mit repaint() Java Basics - Anfänger-Themen 2
P Interpreter-Fehler Im for loop funkzioniert repaint nicht :( Java Basics - Anfänger-Themen 4
M repaint() in run-Methode funktioniert nicht Java Basics - Anfänger-Themen 9
O Probleme mit der repaint-Funktion Java Basics - Anfänger-Themen 6
W repaint() ruft paint() nicht auf Java Basics - Anfänger-Themen 9
J repaint() funktioniert nicht wie gewünscht Java Basics - Anfänger-Themen 30
I Hangman CardLayout/repaint? Java Basics - Anfänger-Themen 2
H Variablen Probleme mit repaint() Java Basics - Anfänger-Themen 2
Y im applet malen ohne repaint paint ? Java Basics - Anfänger-Themen 6
J repaint(); launisch ? Java Basics - Anfänger-Themen 3
E Altes Bild bei repaint() löschen? Java Basics - Anfänger-Themen 10
N JScrollPane repaint(); geht nicht Java Basics - Anfänger-Themen 4
I repaint bei jpanel Java Basics - Anfänger-Themen 10
T repaint wir nicht mehr geöffnet! Java Basics - Anfänger-Themen 38
T Canvas aktualisierung mit repaint Java Basics - Anfänger-Themen 5
C GUI aktualisieren: repaint, validate, Fenstergröße ändern bringt nichts Java Basics - Anfänger-Themen 13
Antoras Swing repaint und Nullpointer Java Basics - Anfänger-Themen 6
O repaint() wird nicht ausgeführt Java Basics - Anfänger-Themen 3
S problem mit repaint() in Thread Java Basics - Anfänger-Themen 6
Antoras swing und repaint-Ersatz Java Basics - Anfänger-Themen 8
G Automatischer repaint bei Swing so wie bei AWT? Java Basics - Anfänger-Themen 7
M Problem mit repaint Java Basics - Anfänger-Themen 2
R Probleme beim Repaint Java Basics - Anfänger-Themen 3
T repaint einer komponente Java Basics - Anfänger-Themen 2
E repaint() aufrufen Java Basics - Anfänger-Themen 12
F paintComponent mit repaint() aufrufen Java Basics - Anfänger-Themen 27
kulturfenster Probleme mit repaint() Java Basics - Anfänger-Themen 2
S SelectionListener + repaint().Verständnisproblem ;) Java Basics - Anfänger-Themen 7
K Repaint() in Methode Java Basics - Anfänger-Themen 13
G Frage zu repaint() Java Basics - Anfänger-Themen 5
D JPanel repaint() wird nicht gemacht! Java Basics - Anfänger-Themen 7
B Problem mit repaint() Java Basics - Anfänger-Themen 8
V Reihenfolge von Befehlen - hier repaint() zu spät Java Basics - Anfänger-Themen 13
G repaint in paint aufrufen? Java Basics - Anfänger-Themen 9
F repaint() - Methode verzögern lassen? Java Basics - Anfänger-Themen 3
I Erst repaint() dann zeichnen? Java Basics - Anfänger-Themen 6
D von paint() und repaint() im Applet Java Basics - Anfänger-Themen 4
J probleme mit repaint Java Basics - Anfänger-Themen 2
M Spielerbewegungen realisieren Java Basics - Anfänger-Themen 2
A MouseMotionListener - wie Mausverfolgung und Neuzeichnen realisieren? Java Basics - Anfänger-Themen 12
H Frage um Eingbeaufforderung zu realisieren Java Basics - Anfänger-Themen 4
A Wie kann ich folgendes Projekt realisieren? Java Basics - Anfänger-Themen 4
L Methoden Methode mit drei Rückgabewerten realisieren Java Basics - Anfänger-Themen 3
L Schaltung realisieren Java Basics - Anfänger-Themen 3
J Frage Antwort Spiel - Wie Zeitcountdown realisieren? Java Basics - Anfänger-Themen 2
L Liste als Array realisieren Java Basics - Anfänger-Themen 23
J Mustererkennung realisieren Java Basics - Anfänger-Themen 10
Y chat programm im internet realisieren Java Basics - Anfänger-Themen 5
T Kleines Spiel realisieren - wie? Java Basics - Anfänger-Themen 6
T 1:1 Beziehungen realisieren ? Java Basics - Anfänger-Themen 13
S Ausgabe realisieren Java Basics - Anfänger-Themen 2
S Grössere MenuBars realisieren Java Basics - Anfänger-Themen 7
D Java Programm mit Internetzugriff realisieren Java Basics - Anfänger-Themen 8
ARadauer timeout realisieren Java Basics - Anfänger-Themen 5
D Logging sätmlicher Vorgänge, wie am besten realisieren? Java Basics - Anfänger-Themen 6
G Physikalisches Problem realisieren Java Basics - Anfänger-Themen 11
G isEmpty selbst realisieren Java Basics - Anfänger-Themen 47
U Texteditor mit methoden realisieren Java Basics - Anfänger-Themen 13
A Beziehung 1-n in Java realisieren Java Basics - Anfänger-Themen 17
S Zeilenumbrüche realisieren Java Basics - Anfänger-Themen 6
I SaveFile Dialog - wie realisieren ? Java Basics - Anfänger-Themen 4
L Timer Swing realisieren Java Basics - Anfänger-Themen 4
P :shock: teilweises wurzelziehen realisieren Java Basics - Anfänger-Themen 9
R Zeitaufwand für Suchmaschine mit Lucene realisieren Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben