Threads Methode verhält sich merkwürdig

ChrisBT

Mitglied
Hallo zusammen,
ich habe zwei Klassen. eine einfache Java-Klasse (ZeitThread), in der wird ein Thread erzeugt:
Java:
public class ZeitThread extends Thread implements Runnable {
    private String zeit1 = "Warte auf Thread";

    @Override
    public void run() {
        while( true ){           
            Start start = new Start();
            zeit1 = new SimpleDateFormat("HH:mm:ss").format(new Date(System.currentTimeMillis() - 3600 * 1000));           
            start.zeitSetzen(zeit1);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {e.printStackTrace();}
        }
    }  
}
und ein JFrame (Start).
Darin gibt es diese Methode:
Java:
public void zeitSetzen(String zeit2){    
        System.out.println("Inhalt von zeit2: " + zeit2);      
        jLabel1.setText( zeit2 );
    }
Es gibt noch einen Start-Button namens Start, der ruft bei Klick die Methode zeitSetzen aus und übergibt ihr einen String, z.B. zeitSetzen("Start-Button wurde geklickt.") <-- Einfach nur zum testen.
In der Main-Methode dieses JFrames wird der Thread (Klasse ZeitThread) gestartet.
Jetzt wird es für mich komisch... :)
Starte ich Start sollte ja normalerweise folgendes geschehen:
1. Der Thread wird erzeugt
2. Die Variable zeit1 wird mit der aktuellen Zeit - 1 Std. geladen
3. Die Methode zeitSetzen wird mit der Variablen zeit1 (Aktuelle Uhrzeit- 1 Std. ) beschickt
4. Die Methode zeitSetzen empfängt den Inhalt von zeit1 und speichert in zeit2
Dann gibt sie den Inhalt von zeit2 im Terminal aus.
5. Sie soll bei jLabel1 den Text ändern, und zwar mit dem Inhalt von zeit2.

Bis Punkt 4 klappt alles. Punkt 5 geht nicht. Der Text bleibt unverändert.
Merkwürdig ist:
Wenn ich die Methode zeitSetzen mit dem Startbutton beschicke, dann kann sie den Text von jLabel1 ändern.
Komisch oder?
Hat jemand eine Idee was das sein könnte?

Gruß
Chris
 

Thallius

Top Contributor
Nein das ist vollkommen normal. Du kannst aus dem nebenläufigen Thread keine UI Veränderungen vornehmen. Dies geht nur im Main-Thread. Dazu gibt es hier auch schon unzählige Threads in dem Forum. Google einfach mal nach Swing und Threads und du wirst jede Menge Lösungen finden...
 

ChrisBT

Mitglied
Hi Thallius, danke für die schnelle Antwort.
Eigentlich ändere ich aus dem Thread ja nicht die UI sondern beschicke eine Methode, die dann die UI ändert. Die Methode zeitSetzen() kann ja das, was der Thread ihr schickt auch im Terminal ausgeben.
Und vom Start-Button aus beschickt, kann sie plötzlich das jLabel1 ändern. Das was ich von Startbutton aus schicke, wird auch im Terminal ausgegeben. So funktioniert die Methode also richtig.
Das verstehe ich nicht so ganz.
 

Thallius

Top Contributor
Wenn du die Methode zeitSetzen() aus dem Thread heraus aufrufst, dann läuft sich auch unter Kontrolle dieses Threads und nicht des Main Thread. Da du Start im Thread erzeugst ist dieser natürlich auch unter Kontrolle des Threads. Warum sollte diese im Thread erzeugte Instanz irgendwas mit dem Main Thread zu tun haben?
 

mrBrown

Super-Moderator
Mitarbeiter
Ist es gewollt, dass im Thread jede Sekunde ein neues Fenster erstellt wird?


(Wenns an den Threads liegt, sollte doch eine Exception geworfen werden?)
 

ChrisBT

Mitglied
Hi mrBrown,
ups, das ist noch ein Überbleibsel von meiner Rumprobiererei. :) :)
Jetzt sieht es so aus:
Java:
public class ZeitThread extends Thread implements Runnable {
    private String zeit1 = "Warte auf Thread";
    Start start = new Start();
   
    @Override
    public void run() {
        while( true ){            
           
            zeit1 = new SimpleDateFormat("HH:mm:ss").format(new Date(System.currentTimeMillis() - 3600 * 1000));            
            start.zeitSetzen(zeit1);            
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {e.printStackTrace();}
        }
    }
       
}
Eine Exception kommt nicht. Läuft alles normal und im Terminal wird im Sekundentakt die Uhrzeit ausgegeben.

Viele Grüße
 

ChrisBT

Mitglied
Im Fenster gibt es ein jLabel (jLabel1) und einen Start-Button (start).
In der Main Methode wird er Thread gestartet
Java:
Thread t1 = new Thread(new ZeitThread());
        t1.start();
Dann gibt es noch die Methode zeitSetzen:
Java:
public void zeitSetzen(String zeit2){
     
        System.out.println("Inhalt von zeit2: " + zeit2);
       
        jLabel1.setText( zeit2 );
    }
 

ChrisBT

Mitglied
Ich arbeite mit NetBeans. Das ist ein von NetBeans erzeugter code für ein JFrame.
Java:
package ThreadTest01;

import java.text.SimpleDateFormat;
import java.util.Date;


public class Start extends javax.swing.JFrame {

    public Start() {
        initComponents();
       
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        start = new javax.swing.JButton();
        stop = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setFont(new java.awt.Font("Dialog", 1, 36)); // NOI18N
        jLabel1.setText("jLabel1");

        start.setText("Start");
        start.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                startActionPerformed(evt);
            }
        });

        stop.setText("Stop");
        stop.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                stopActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(31, 31, 31)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 657, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(start)
                        .addGap(33, 33, 33)
                        .addComponent(stop)))
                .addContainerGap(33, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(50, 50, 50)
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(46, 46, 46)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(start)
                    .addComponent(stop))
                .addContainerGap(186, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void startActionPerformed(java.awt.event.ActionEvent evt) {                                      
       zeitSetzen("Vom Start-Button...");
    }                                    

    private void stopActionPerformed(java.awt.event.ActionEvent evt) {                                    
        // TODO add your handling code here:
    }                                    

    public void zeitSetzen(String zeit2){
     
        System.out.println("Inhalt von zeit2: " + zeit2);
       
        jLabel1.setText( zeit2 );
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
       
       
        //t1.interrupt();
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Start.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Start.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Start.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Start.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Start().setVisible(true);
            }
        });
       
        Thread t1 = new Thread(new ZeitThread());
        t1.start();
        System.out.println("Jetzt wird gestoppt!");
       
       
    }

    // Variables declaration - do not modify                    
    private javax.swing.JLabel jLabel1;
    private javax.swing.JButton start;
    private javax.swing.JButton stop;
    // End of variables declaration                  
}
 

mrBrown

Super-Moderator
Mitarbeiter
Wie gesagt: Du erstellst in deinem neuem Thread ein neues Fenster, von dessen JLabel du die Zeit aktualisiert, das Fenster setzt du aber nie auf visible.
 

ChrisBT

Mitglied
Hallo mrBrown,
wo muss ich denn wie auf visible setzen?
Bin noch am lernen und blicke da gerade nicht durch.
Ich habe es gerade im ZeitThread versucht.
Start start =new Start();
start.setVisible(true);
Das mochte er schon mal nicht. :)
 

mrBrown

Super-Moderator
Mitarbeiter
Du solltest gar kein neues Start-Fenster in deinem Thread erstellen, sondern dem Thread dein Bestehens Fenster übergeben (und nimm das extends Thread raus, implements Runnable reicht ;) )
 

ChrisBT

Mitglied
Also extends Thread habe ich raus genommen; danke für den Tipp. :)
Wo übergebe ich dem Tread denn mein bestehendes Fenster? Sorry, ich raff das gerade nicht. :(
 

mrBrown

Super-Moderator
Mitarbeiter
Indem du ZeitThread einen passenden Konstruktor hinzufügst und ihn dann in der Main zB so aufrufst:
Java:
/* Create and display the form */
       
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        Start start = new Start();
        start.setVisible(true);

        Thread t1 = new Thread(new ZeitThread(start));
        t1.start();
        System.out.println("Jetzt wird gestoppt!");
    }
});
 

ChrisBT

Mitglied
Im JFrame habe ich den Aufruf jetzt so angepasst und habe den von NetBeans vorgeschlagenen Konstruktor in den ZeitThread eingefügt. Das Ergebnis sind jede Menge Fehlermeldungen. Ich denke mal, dass der Vorschlag von NetBeans nicht so gut war. o_O
ZeitThread(Start start) {
throw new UnsupportedOperationException("Not supported yet.");
Gruß
Chris
 

mrBrown

Super-Moderator
Mitarbeiter
Im JFrame habe ich den Aufruf jetzt so angepasst und habe den von NetBeans vorgeschlagenen Konstruktor in den ZeitThread eingefügt. Das Ergebnis sind jede Menge Fehlermeldungen. Ich denke mal, dass der Vorschlag von NetBeans nicht so gut war. o_O
ZeitThread(Start start) {
throw new UnsupportedOperationException("Not supported yet.");
Gruß
Chris
Der Konstruktor ist ja auch völliger Unsinn...du solltest den schon mit einem sinnvollen ersetzen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Simon16 compareTo Methode überschreiben Allgemeine Java-Themen 4
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
M CrudRepository save Methode mocken Allgemeine Java-Themen 6
thor_norsk toString() - Methode Allgemeine Java-Themen 6
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
T C++ Methode Übersetzung in Java Allgemeine Java-Themen 3
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
R @author vor Methode (eclipse) Allgemeine Java-Themen 1
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
Y Java Bruttoberechnen + runden Methode Allgemeine Java-Themen 1
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
A Ist ein enum hier richtig? Enum toString() Methode. Allgemeine Java-Themen 1
Scream_ilias brute force methode verbessern? Allgemeine Java-Themen 6
Scream_ilias passwort meines pc per brute force methode knacken Allgemeine Java-Themen 4
S static methode im Interface Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Sinn einer toString Methode Allgemeine Java-Themen 3
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L ToString-Methode Allgemeine Java-Themen 6
X Datentypen NPE in längerer Methode Allgemeine Java-Themen 12
I Methoden Generics-Methode Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
B APi methode kurz anhalten Allgemeine Java-Themen 8
P Methode aus anderem Paket aufrufen Allgemeine Java-Themen 1
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
R Rekursive Methode Allgemeine Java-Themen 8
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
R rekursive und iterative Methode Allgemeine Java-Themen 3
P Methoden Anwendung der allMatch()-Methode Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
D Methoden Methode zum Steinschnitt Allgemeine Java-Themen 2
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
D Returnwert aus einer Methode gerundet ausgeben lassen Allgemeine Java-Themen 2
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
snipesss Methode greift nicht auf JTextPanel zu Allgemeine Java-Themen 3
R Methode in Methode voraussetzen Allgemeine Java-Themen 8
S Überschriebene Methode der Oberklasse der Oberklasse aufrufen. Allgemeine Java-Themen 5
D Methode dynamisch aufrufen Allgemeine Java-Themen 2
Sogomn Methode als Parameter? Allgemeine Java-Themen 3
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2
KaffeeFan Methoden Suche Methode um Programm kurz warten zu lassen Allgemeine Java-Themen 22
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
BRoll Methode abbrechen (Invoke von außen) Allgemeine Java-Themen 5
I Methode verallgemeinern (Methode als Parameter)? Allgemeine Java-Themen 10
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
G Threads Methode nebenbei ausführen, Status verarbeiten Allgemeine Java-Themen 4
H FTP Befehl/Java Methode für Submit im z/Os (Host) Allgemeine Java-Themen 1
M Fabrik Methode, gutes Beispiel? Allgemeine Java-Themen 0
M WebService - Zugriff auf Webservice Methode über Browser Allgemeine Java-Themen 1
N WaitForScript- methode in javafx Allgemeine Java-Themen 1
2 jede Stunde Methode ausführen Allgemeine Java-Themen 8
M Eine static-Methode verlassen Allgemeine Java-Themen 2
P "Overriden statische Methode" Statische Methode die vererbt wird Allgemeine Java-Themen 5
X Komponente an Methode übergeben Allgemeine Java-Themen 1
A Methode ergibt Java NullpointerException. Allgemeine Java-Themen 3
S Getestete Methode um das Beste aus URL-Nutzereingaben rauszuholen..? Allgemeine Java-Themen 4
L Methoden Methode gibt mir beim verschlüsseln mit RSA 0 bytes aus ? Allgemeine Java-Themen 1
D Methode mit optionalen Parametern in Interface Allgemeine Java-Themen 3
C DBConnection als Methode in mehreren Klassen Allgemeine Java-Themen 4
S Methode funktioniert nicht als ActionListener Allgemeine Java-Themen 4
M Methoden Methode Auslagern Allgemeine Java-Themen 6
P 4 Threads in einer Methode Allgemeine Java-Themen 2
A Methoden Generische Methode mit Arrays - Source Compatibility 1.7 benötigt, wieso? Allgemeine Java-Themen 3
N Methoden Methode Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben