# Zugriff auf Objekt (JTextField) einer anderen Klasse



## UJones (29. März 2007)

Hallo,

ich versuche mich seit ein paar Tagen in Java (bedingt durch die Hochschule).
Anfangs noch mit Erfolg gekrönt (Klasse Fenster erbt von JFrame und hat standardmäßig ein Textfeld; neues Objekt frm von Fenster in Startklasse angelegt und sichtbar gemacht; diverse Objekte im Fenster platzieren; ActionListener, MouseListener, WindowListener benutzt), doch nun steh ich vor einem Problem und find hinten und vorne keinen Ansatz für eine Lösung.

Die Aufgabe lautet: Bauen Sie eine Digitaluhr

Also dacht ich an ein Fenster mit einem Label oder Textfeld in dem im Sekundentakt die Uhrzeit geschrieben wird.
Eine Task hab ich mir schon erstellt mit 1s-Intervall. Das funktioniert auch soweit, lasse mir einen Text auf die Ausgabe schreiben.

Als nächsten Schritt wollte ich statt auf der Ausgabe in das Textfeld des Fensters schreiben. Wenn dies funktioniert, wollte ich mich mit der Klasse Date beschäftigen, zur Anzeige der Uhrzeit. Allerdings funktioniert es nicht.

*Start.java*

```
package digitaleuhr;

import java.util.Timer;

/**
 *
 * @author johannes
 */
public class Start
{

    /** Creates a new instance of Start */
    public Start()
    {
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
{
        // TODO code application logic here
        Timer timertask = new Timer();
        timertask.schedule(new Task(), 3000, 1000);
        
        
        Fenster frm = new Fenster();
        frm.setSize(400, 400);
        frm.setVisible(true);
    }
    
}
```

*Fenster.java*

```
package digitaleuhr;

import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;

/**
 *
 * @author johannes
 */
public class Fenster extends JFrame
{
    public JLabel lblAusgabe;
    
    /** Creates a new instance of Fenster */
    public Fenster()
    {
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        // Label zur Ausgabe erzeugen und platzieren
        lblAusgabe = new JLabel("############");
        Container cont = this.getContentPane();
        cont.setLayout(new FlowLayout());      
        cont.add(lblAusgabe);
    }
    
}
```

*Task.java*

```
package digitaleuhr;

import java.util.TimerTask;

/**
 *
 * @author johannes
 */
public class Task extends TimerTask
{
    
    /** Creates a new instance of Task */
    public Task()
    {
    }

    public void run()
    {
        System.out.println("TEST TEST TEST");
        //Fenster.lblAusgabe.setText("TEST TEST TEST");
    }
    
}
```


Vielleicht kann sich mal einer den Code anschauen und mir sagen, wie ich auf lblAusgabe zugreifen kann von der Task aus.
Dass ich über die Instanz frm mittels frm.lblAusgabe.setText etwas bewirken kann ist mir klar, aber wie mach ich das von der Task aus


Gruß,

Johannes


----------



## KlaDi (29. März 2007)

Hallo,

da dein Label global ist, kannst Du ganz einfach darauf zugreifen. Und zwar mit:


```
Fenster.lblAusgabe.setText("Dein Text");
```

sollte es funktionieren.

Gruß KlaDi.

PS.: Ich würde das Label in der Fenster.java aber grundsätzlich als private statt public deklarienen und eine Methode schreiben, die dann so aussieht:


```
public static void setAusgabe(String paAusgabe) {
  lblAusgabe.setText(paAusgabe);
}
```
dieses könntest Du dann mit 
	
	
	



```
Fenster.setAusgabe("Dein Text");
```
 aufrufen.


----------



## UJones (29. März 2007)

Hallo KlaDi,

vielen Dank für die wirklich flotte Antwort.
Ich wollte es erstmal global (public) probieren, aber da das schon nicht funktioniert, brauchte ich es nicht mit private probieren.

Evtl. siehst du bei mir die auskommentierte Zeile, wo ich direkt auf lblAusgabe.setText zugreife.
//Fenster.lblAusgabe.setText("TEST TEST TEST");​Wenn ich das so aber in Netbeans drinstehen lasse, meckert er mir beim Builden:
_non-static variable lblAusgabe cannot be referenced from a static context_​und verweist auf obige Zeile.

Wo liegt der Fehler?!

Vielen Dank schonmal für den Weg mit der eigenen Methode. Das ist natürlich die saubere Programmierung, nur will ich die Hintergründe möglichst gut verstehen und warum das oben nicht geht, ist mir ein Rätsel ...


*EDIT:*
Hab gerade das Ganze mit "private JLabel lblAusgabe" probiert und die Methode setAusgabe unter den Konstruktor Fenster() gesetzt. Auch hier bringt er besagte Fehlermeldung!!

*EDIT2:*
Hab des Rätsels Lösung: "private static JLabel lblAusgabe" hat geholfen. _static_ in Verbindung mit Methoden ist mir ein Begriff, aber hier bei einem Objekt!? Kann mir das jemand erklären bitte!


----------



## KlaDi (30. März 2007)

Hallo,

zu Deiner Frage bezüglich der statitschen Variablen, hab ich beim googlen das hier gefunden: 





> Der Feldmodifizierer "static" legt fest, daß die Variable statisch  ist, also während der gesamten Laufzeit eines Programms existiert. Eine statische Variable wird inkarniert (d.h. ihre Laufzeit-Existenz beginnt), wenn seine Klasse initialisiert wird.



Ist von dieser Seite hier: http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht11Ht/java_statische_benannte_variablen_de


Gruß KlaDi.


----------

