Sekunden Takt in java anzeigen

Nud3l

Mitglied
Hallo

ich steh vor einem kleinen Problem und wollt mich daher hier um Rat bemühen

Ich möchte in einem Java Programm ein text, Label oder irgendwas in der art ein bauen das mir an zeigt wie lange das Fenster geöffnet ist und es soll automatisch hoch zählen

Nur habe ich keine Idee wie ich das anstelle ich habe erst an Threds gedacht mit sleep usw. aber das Problem ist wie genau ist mein Sekunden zeit nach 2stunden oder nach einer noch längeren zeit?

das 2. Problem wie kann ich die zeit immer weiter geben habe ein observer drin aber jede Sekunde ein observerobjekt zu erzeugen ist ja auch nicht so gut da am observer noch sehr viel mehr dran hängt
 
Moin,

ich habe zwar Dein Problem ncht wirklich verstanden, aber vielleicht ist das Stichwort "Timer" das, was Du suchst!

Gruß
Klaus
 
oh das Wort Timer hilft mir schon mal weiter

werde es mal mit scheduleAtFixedRate()

jetzt ist nur die frage wie ich das in mein model und meiner gui einbaue so das beide den gleichen Timer haben

werde mal probieren den Timer in mein model zu implementieren und eine Referenz davon in der gui über geben
 
Hallo,

dazu (wie immer) gibts mehrere Möglichkeiten:
Java:
package de.tutorials;

import static java.util.concurrent.TimeUnit.SECONDS;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;

public class SchedulingExample {
	public static void main(String[] args) {
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
			public void run() {
				System.out.println("New: " + System.currentTimeMillis());
			}
		}, 0, 1, SECONDS);

		new Timer().scheduleAtFixedRate(new TimerTask() {
			public void run() {
				System.out.println("Old: " + System.currentTimeMillis());
			}
		}, 0, 1000);

		new javax.swing.Timer(1000, new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.out
						.println("Swing Timer: " + System.currentTimeMillis());
			}
		}).start();
		
	}
}


Denk daran, dass wenn du aus einem anderen Thread Java Swing Komponenten Manipulieren willst, dass du das immer über den Event Dispatch Thread laufen lässt (also per java.awt.EventQueue.invokeLater / invokeAndWait bzw. javax.swing.SwingUtilities.invokeLater / invokeAndWait)

Gruß Tom
 
Oh danke das hilft mir schon etwas weiter habe es mit den Timertask probiert..

vielleicht probiere ich auch mal mit der neuen variante soviel habe ich noch nicht implementiert.. gibt es da vor und nachteile?

Das Swingzeug scheidet schon mal kategorisch aus da ich in SWT programmiere :)

ich habe bis jetzt ne ArrayList von Timer gebaut da ich mehre Timer gleichzeitig starten muss die verschiedene aufgaben haben. nur weiß ich nicht ob sie alle richtig laufen beim starten gibt es keine Problem muss ich mich mal morgen dumm kümmern



ich weiß nur noch nicht wie ich meine Oberfläche von den Veränderungen unterrichte observer ist wohl nicht ganz so toll...
 
Hallo,

Das Swingzeug scheidet schon mal kategorisch aus da ich in SWT programmiere

Bei SWT ist das das gleiche Spiel wie in Java Swing (dort ist es sogar noch viel strenger).

Dort musst du dann
Java:
display.asyncExec(Runnable runnable)
bzw.
display.syncExec(Runnable runnable)
benutzen, sobald du Widgets von einem nicht SWT Thread manipulieren willst.

Gruß Tom
 
ich habe das erstmal nach hinten geschoben jetzt muss ich mich wohl dran wagen

und ich stehe ziemlich auf den Schlauch irgendwie kann ich mit dein Code nichts anfangen. Im Moment startet ich einen Timer mit einen Button

Dann habe ich eine Klasse in der der Timer ausgeführt wird das klappt auch, nur die anzeige von Werten die der Timer verändert bereitet mir Probleme.

Ich habe zum an zeigen in dem Fenster ein eigenen Timer eingebaut aber das klappt nicht entweder schmeißt er eine exeption beim verändern des textes oder beim syncExec()...

in aktuellAPWerte ist auch ein Timer drin kann man auf den auch irgendwie zugreifen dann bräuchte ich ja keine 2 Timer für einen Wert

Code:
aktuellAPWerte = tempKnoten.getLnkAPWerte();
		
		umlaufSekundeText.setText(Integer.toString(umlaufSekundeTX));
		
		umlaufSekundeTX= aktuellAPWerte.getUmlaufSekundeTX();

		timer = new Timer();
		
		
		
		if(aktuellAPWerte.isRunTimer()){
			timer.scheduleAtFixedRate(new TimerTask() {
				public void run() {
					umlaufSekundeTX++;
				//APWerteeditor.this.getEditorSite().getShell().getDisplay().getCurrent().syncExec(this);
				//	Display.getCurrent().syncExec(this);
					umlaufSekundeText.setText(Integer.toString(umlaufSekundeTX));
				}	
			}, 0, 1000);
 
Nach etwas suchen habe ich es nun geschafft aber auf einen etwas anderen Weg

Code:
	if(aktuellAPWerte.isRunTimer()){
			Runnable timer = new Runnable() {
		   	public void run() {
		     	 umlaufSekundeTX= aktuellAPWerte.getUmlaufSekundeTX();
		    	 umlaufSekundeText.setText(Integer.toString(umlaufSekundeTX));
		    	 APWerteeditor.this.getEditorSite().getShell().getDisplay().timerExec(500, this);
		      }
		    };
		    APWerteeditor.this.getEditorSite().getShell().getDisplay().timerExec(500, timer);
		    
		}else{
			umlaufSekundeText.setText(Integer.toString(umlaufSekundeTX));		
			umlaufSekundeTX= aktuellAPWerte.getUmlaufSekundeTX();		
		}
 

Neue Beiträge

Zurück