# JTextField im Laufe des Programmes aktualisieren



## eicon11 (3. Mai 2008)

Hallo, ich habe folgendes Problem ich versuche gerade für mein Programm einen Timer im GUI zu implementieren.
Den Timer habe ich schon, aber ich weiß nicht wie ich die Felder updaten (also den Timer runterzählen) lassen kann ich habe jeweil 3 jTextFields erstellt und wollte sie durch eine Methode oder auch Schleife immer wieder updaten lassen. Dass funktioniert aber nicht, da die Felder von vornherein ja als private deklariert sind und ich so nicht von außerhalb auf sie zugrifen kann.

Übergangsweise habe ich jetzt einen Button implementiert der die updates auf Knopfdruck ausführt

jTextField3.setText(Countdown.hours());
jTextField4.setText(Countdown.minutes());
jTextField5.setText(Countdown.seconds());

Ich hoffe mir kann jemand helfen.

MfG 

eicon11


----------



## Marco13 (3. Mai 2008)

Hm - ein paar Begriffe durcheinandergeworfen (Schleife oder auch Methode) und man soll wissen, wie die Programmstruktur ist. Aber ganz pragmatisch: Da, wo die TextFields liegen, kannst du eine public Methode machen

```
public void setTime(String hours, String minutes, String seconds)
{
    hourTextField.setText(hours);
    minuteTextField.setText(minutes);
    secondTextField.setText(seconds);
}
```
oder das GUI kann den Timer ("das Modell") kennen, und sich selbst die Daten davon holen und in "seine" Textfields schreiben. Wähle weise :wink:


----------



## eicon11 (3. Mai 2008)

Ja das habe ich erst auch so gemacht, ich habe dann noch eine 2te Klasse erstellt, die die Methode setTimer dann immer in abständen von 1ner Sekunde aufruft, aber das Problem ist dass diese Methode static sein muss und ich die Felder aber nur non-static aufrufen kann.
Und ich weiß nicht wie ich das anders machen kann.


----------



## SlaterB (3. Mai 2008)

damit die statische Operation auf irgendwas zugreifen kann, muss sie statische Variablen zur Verfügung haben,
du müsstest also die JTextFields oder besser das Objekt welches sie enthält irgenwo statisch ablegen,

schön ist das allerdings nicht, erkläre lieber mit mehr Worten udn Code, was die statische Operation so macht, warum sie statisch ist usw.,

ohne Erklärung kann man nichts weiter sagen


----------



## eicon11 (4. Mai 2008)

Ok, also ich Programmiere in NetBeans und hab mir ein Programm gebaut, was meinen Rechner nach einer gewissen Zeit von alleine ausstellt.Das Programm funktioniert, nur wollte ich jetzt noch einen Timer erstellen der mir sozusagen ausgibt wie viel Zeit ich noch bis zum Herunterfahren habe.

Den Timer an sich habe ich in einer eigenen Klasse Timer abgelegt, der 3 Methoden enthält, eine für die Stunden,Minuten und Sekunden, jeden von denen gibt einen String zurück den ich dann in sein jeweiliges jTextField ausgeben wollte.
Das funktioniert auch, solange ich es z.B. über einen Button mache. 


```
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    jTextField3.setText(Timer.hours());

    jTextField4.setText(Timer.minutes());

    jTextField5.setText(Timer.seconds()); 

    }
```

Ich möchte aber dass ich nicht immer auf den Knopf drücken muss sondern das Programm die Textfelder von alleine updatet.
Dann habe ich eine Methode geschrieben die das für mich machen sollte:


```
public void setjTextField(String seconds, String minutes, String hours){
        
    this.jTextField3.setText(hours);
    this.jTextField4.setText(minutes);
    this.jTextField5.setText(seconds); 
    
    }
```

Das Problem ist jetzt das sie nicht statisch ist und ich sie deshalb nicht von der Main-Methode oder einer anderen Methode von außerhalb ansprechen kann


----------



## André Uhres (4. Mai 2008)

_Die Lösung ist einfach, nur dran denken muss man:_
http://www.java-forum.org/de/viewtopic.php?t=7895


----------



## eicon11 (4. Mai 2008)

Ah ok stimmt, mach Sinn hätte ich auch drauf kommen können  

Allerdings gibt es jetzt das nächste Problem, die Felder werden trotzdem nicht aktualisiert, wenn ich mir die Strings über System.out.println ausgeben lasse dann schreibt er es mir in die Console aber die Felder setzt er nicht


```
public void setjTextField(String seconds, String minutes, String hours){
        
    jTextField3.setText(hours);
    jTextField4.setText(minutes);
    jTextField5.setText(seconds); 
    System.out.println("Stunden " + hours + " minutes " +minutes + " seconds " +seconds);
    }
```

Es funktioniert nur über den extra Knopf


```
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    jTextField3.setText(Timer.hours());

    jTextField4.setText(Timer.minutes());

    jTextField5.setText(Timer.seconds()); 

    }
```

Hab ich da was mit den Befehlen verwechselt ?


----------



## André Uhres (4. Mai 2008)

Die einzige Erklärung ist, daß du zwei verschiedene Instanzen von der Klasse benutzt, welche die Textfelder enthält: eine sichtbare und eine unsichtbare. Und mit setjTextField setzt du du den Text der unsichtbaren Klasse. Die Lösung ist, nur eine einzige Instanz zu verwenden. Dazu könntest du z.B. der zweiten Klasse eine Referenz auf die erste im Konstruktor übergeben und dann dort als Instanzvariable abspeichern. Über diese Referenz kannst du dann die Methode setjTextField aufrufen.


----------



## eicon11 (6. Mai 2008)

Ok danke euch jetzt funktioniert es !
Eine frage hätte ich aber noch, was macht diese Zeile, die wurde als ich die Grafische Oberfläche gebastelt habe Automatisch in die main Methode geschrieben.allerdings musste ich sie damit alles funktioniert entfernen, jetzt frage ich mich nur was der eigentliche Zweck davon ist und ob ich wenn ich sie entferne damit irgendwas kaputt mache ?


```
java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                
              new ShutDownGUI().setVisible(true);
            }
        });
```

Btw. braucht jemand einen Timer der den Pc automatisch ausstellt ? ;-)


----------



## André Uhres (7. Mai 2008)

eicon11 hat gesagt.:
			
		

> was macht diese Zeile


http://www.java-forum.org/de/viewtopic.php?p=348628#348628



			
				eicon11 hat gesagt.:
			
		

> braucht jemand einen Timer der den Pc automatisch ausstellt ?


Ja.


----------



## eicon11 (10. Mai 2008)

Ok danke dir, ich habe das Programm mal hochgeladen wer will kann mir ja mal ein feedback geben.

Erstmal danke an alle für die Hilfe !

http://rapidshare.com/files/113968095/PcAusschalten.jar


----------



## André Uhres (10. Mai 2008)

Danke für den Timer.
Das System wird einwandfrei runtergefahren.
Aber der PC bleibt eingeschaltet. Ich muss extra den Ausschalter am PC drücken, um ihn ganz auszuschalten.
Könnte man das ändern?


----------



## eicon11 (10. Mai 2008)

Ja, hast recht das ist mir auch schon teilwese aufgefallen, dass liegt wohl an dem Befehl shutdown -a den ich zum runterfahren verwendet hatte.

Ich hab jetzt den Befehl nen bischen abgeändert, jetzt ist auch nicht mehr diese 30 Sekunden Wartezeit am Ende da.
Hab meinen Pc jetzt damit 5 mal runtergefahren und hat immer geklappt .

http://rapidshare.com/files/113968095/PcAusschalten.jar


----------



## André Uhres (10. Mai 2008)

Leider dasselbe Ergebnis bei mir (ausser das Fehlen der Übergangszeit, die ich aber lieber noch länger gesehen hätte).


----------



## eicon11 (11. Mai 2008)

Hmm das ist allerdings komisch, welches Betriebssystem benutzt du denn ? Weißt du noch alternativ einen anderen Shutdown Befehl oder so etwas ähnliches das ich einbauen könnte ?


----------



## André Uhres (11. Mai 2008)

eicon11 hat gesagt.:
			
		

> welches Betriebssystem benutzt du denn ?


Windows XP Version 2002 Service Pack 2 
(ansonsten weiss ich nix)


----------



## eicon11 (13. Mai 2008)

Hmm keine Ahnung ich hab nochmal was am Befehl verändert wenn es jetzt immer noch nicht geht dann keine Ahnung  bei mir funktioniert es, hab auch wieder die 30 Sec drin wenn du einen anderen Befehl findest wie shutdown -s dann kannst du mir ja ne pm schreiben oder so dann versuche ich es damit.

http://rapidshare.com/files/116802971/PcAusschalten.jar


----------

