Änderungen im Frame werden zu spät durchgeführt

Status
Nicht offen für weitere Antworten.

Durandir

Mitglied
Hallo, ich habe ein Problem und komme leider nicht weiter. Ich hatte mal ein Spiel gesehen, wobei man sich in einer bestimmten Zeit eine Zahl einprägen und diese dann nachher wiedergeben musste. Dieses Spiel wollte ich nachprogrammieren und insoweit "verbessern", dass man die Zeit, in der die Zahl sichtbar ist, variieren kann.
Leider klappt es aber nicht so, wie ich es möchte. Zu dem Kode unten: Die Methode losgehts ist eine Framemethode und wird über einen Button aufgerufen. Darin wird je nach Größe des Eingabeparameters i eine Zahl zufällig erstellt und sollte dann im Label angezeigt werden. Danach wird ein Threadobjekt erzeugt, darin 2000ms gewartet und am Ende sollte die Zahl im Label durch "**" ersetzt werden.
Mein Problem ist, dass zwar die richtige Zahl pünktlich auf der Console ausgegeben wird, aber im Labelfeld immer nur die "**" erscheinen. Lasse ich die letzte Zeile aber weg, dann erscheint auch die richtige Zahl.
Ich hatte es auch schon mit sowas wie "busy waiting(for-Schleife)" versucht, aber es klappt irgendwie nicht.

Kann mir einer da weiterhelfen?

Vielen Dank schon einmal
Gruss
Durandir


Code:
public void losgehts(int i){
     
     int j;
     
     int f[] = new int[10];
     
     AFrame.this.c="";    //Stringvariable des Frames
     
    
     for(j=0;j<i;j++){
         f[j]=(int) (10*Math.random());
         AFrame.this.c= String.valueOf(AFrame.this.c+""+f[j]);
     }
          
     System.out.println(AFrame.this.c);         //die kommt pünktlich
     AFrame.this.jLabelZahl.setText(""+AFrame.this.c+"");   //diese Zahl erscheint niemals
     
     
    Warten warten = new Warten(AFrame.this);   //Threadobject zum Warten von 2000ms
    
    try {
   
        warten.start();
        warten.join();
     
    }catch(Exception e){
        System.out.println("Ochnö"+e);
    }
    
    AFrame.this.jLabelZahl.setText("**");  //dies ist immer schneller, als die eigentliche Zahl
     
 }
 
B

Beni

Gast
Die Logik (dein "losgehts") muss in einem anderen Thread als das Fenster laufen.

Klassisch sieht das dann so aus:
Code:
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Test{
    public static void main( String[] args ) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        final JLabel label = new JLabel( "0" );
        frame.getContentPane().add( label );
        frame.setBounds( 20, 20, 300, 200 );
        frame.setVisible( true );
        
        // Die Logik in einen eigenen Thread
        Thread thread = new Thread(){
            public void run(){
                int index = 0;
                
                // Hier kann man alles wüste machen
                while( true ){
                    final int current = index++;
                    
                    // AWT/Swing ist nicht threadsicher, mit diesem Konstrukt
                    // lagert man den Aufruf von "setText" in eine sichere 
                    // Umgebung aus.
                    EventQueue.invokeLater( new Runnable(){
                        public void run(){
                            label.setText( String.valueOf( current ) );
                        }
                    });
                    
                    try{
                        // Diesen Thread kann man pausieren.
                        Thread.sleep( 1000 );
                    }
                    catch( InterruptedException ex ){
                        ex.printStackTrace();
                    }
                }
            }
        };
        thread.start();
    }
}
 

Durandir

Mitglied
Besten Dank für die schnelle Antwort. Für mich als Anfänger sieht dein Kode zwar noch etwas wirr aus, aber ich werde mal versuchen mich da reinzuwühlen. Ich habe nun erstmal die eine eigene Klasse erstellt und wenn ich die laufen lasse, dann klappt das auch mit der zuerst erscheinenden Zahl. Wenn ich nicht möchte, dass das Label dann allerdings nicht mehr private ist, weil halt auch die andere Klasse draufzugreifen will, dann muss ich via call-back die Kontrolle an das Frame übergeben, die Änderung durchführen lassen und wieder zurück in die Klasse wechseln, oder?

Kannst du mir auch sagen, warum die Logik ausgelagert sein muss? Ich meine, selbst wenn man keine Threads verwendet, sondern die Wartezeit mittels 1000 Ausgaben auf der Konsole "simuliert", dann klappt es ja auch nicht.

Danke nochmals.....
Gruss
Durandir
 
B

Beni

Gast
Zu 1: Praktisch kannst du das EventQueue-Zeugs in eine Methode des Frames kopieren, die das Label verändert. Das wird etwa das sein, was du mit "call-back" meinst?

Zu 2: Es schwirren viele Threads durch die Gegend. Einer dieser Threads ist der AWT-Thread. Dieser Thread ist dafür zuständig, dass Frames gezeichnet werden, Mouse-Events bei den Listeners ankommen, etc...
Wenn man Pech hat, arbeitet man in diesem AWT-Thread, und damit kann der AWT-Thread nicht neuzeichnen. Deshalb muss man die "Logik" in einen eigenen Thread stecken.
 

Durandir

Mitglied
Hmmm....also ich fürchte, ich habe es immer noch nicht so recht.

Ich habe nun einmal eine Klasse erstellt, darin das Frame erzeugt und es mit einer 5-stelligen Zahl durchlaufen lassen..klappt.

Danach wollte ich das Programm wieder zusammenbauen. Also erzeuge ich in der neuen Klasse ein Objekt davon und erstelle danach ein neues Frame, wobei ich diesem Frame die Adresse des Objekt mitgebe. In dem Frame lasse ich nun auf Knopfdruck die Stelligkeit der Zahl hochzählen und rufe die Methode der neuen Klasse auf, wo nun die Zahl berechnet und die Labels geändert werden. Als Parameter übergebe ich wieder die Adresse des Frames sowie die Stelligkeit, was jeweils in Attributen der Klassen gespeichert wird.

Aber irgendwie bin ich wieder da, wo ich vorher auch war. Das Frame wird nun in der neuen Klasse erstellt und auch die Labels werden von da geändert, aber wieder habe ich das Anfangsproblem.
 

Durandir

Mitglied
Ach, nun habe ich es verstanden. Es ist wichtig, dass man sich nicht mittels einer neuen Klasse Zutritt verschafft, sondern sich in einem anderen Thread befindet. Dein letzter Absatz war sehr hilfreich. Ich habe nun in der neuen Klasse einen neuen Thread ins Leben gerufen und nun klappts. Nur ist das Programm ziemlich wirr und ich muss nun mal schauen, dass es wieder übersichtlich wird.

Danke nochmals....jetzt klappts endlich =)

Gruss
Durandir
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
AGW App programmiert lassen, aber Änderungen vornehmen Java Basics - Anfänger-Themen 13
S Input/Output Nur Änderungen speichern Java Basics - Anfänger-Themen 21
K Objekt soll Anwendung über Änderungen informieren Java Basics - Anfänger-Themen 8
T Compiler-Fehler Eclipse reagiert nicht mehr auf Änderungen im Code Java Basics - Anfänger-Themen 2
B Änderungen in der JAR speichern Java Basics - Anfänger-Themen 6
O Änderungen innerhalb for-Schleife speichern Java Basics - Anfänger-Themen 17
W Änderungen bemerken Java Basics - Anfänger-Themen 10
G Änderungen in TextFelder feststellen Java Basics - Anfänger-Themen 4
Alex_99 Aktion ausführen wenn Frame disposed wurde Java Basics - Anfänger-Themen 5
frager2345 Fensterklasse, Wie auf Frame im Listender zugreifen (ItemEvents) Java Basics - Anfänger-Themen 7
S GUI Frame wechseln Java Basics - Anfänger-Themen 15
C Exportierte JAR öffnet zweiten Frame nicht mehr Java Basics - Anfänger-Themen 7
C Erkennen ob Frame geschlossen wurde Java Basics - Anfänger-Themen 2
C Erste Schritte Spieler an anderen Frame weitergeben Java Basics - Anfänger-Themen 23
G Probleme bei Frame aufgaben Java Basics - Anfänger-Themen 6
CptK Interface Klasse Frame (extends JFrame) aus anderer Klasse schließen Java Basics - Anfänger-Themen 7
S Interface (WindowBuilder) Panels in einen Frame einfügen Java Basics - Anfänger-Themen 10
S Nach dem Herüberschieben eines Arrays zwischen 2 Frames öffnet sich das Frame nicht mehr Java Basics - Anfänger-Themen 12
S in ActionListener auf Eingabe aus anderem Frame warten Java Basics - Anfänger-Themen 2
D Interface Frame doppelt durch Aufruf der GUI Klasse Java Basics - Anfänger-Themen 1
M Erste Schritte Neuen Frame nur einmal offen haben Java Basics - Anfänger-Themen 6
schoenosrockos JButton füllt immer das ganze frame Java Basics - Anfänger-Themen 1
R Erste Schritte Frame mit Ladebalken und BestätigungsButton Java Basics - Anfänger-Themen 10
das_leon Interface Frame in einem Frame (Window Builder) Java Basics - Anfänger-Themen 2
Anfänger2011 Frame zeigt nicht gewünschtes Ergebnis an ... Java Basics - Anfänger-Themen 5
Z Object Kreis am Frame abprallen lassen! Java Basics - Anfänger-Themen 12
D Bild in Frame einfügen Java Basics - Anfänger-Themen 11
I Methoden Schwierikeiten mit Protokollfenster (Frame Objekt) Java Basics - Anfänger-Themen 4
A mehrere Panels in eigenen Klasssen in einem Frame Java Basics - Anfänger-Themen 16
J Extra Fenster (Frame) Java Basics - Anfänger-Themen 20
W Frame in anderer Klasse anzeigen lassen Java Basics - Anfänger-Themen 1
E Von Instanz des Dialogs auf das Frame zugreifen Java Basics - Anfänger-Themen 8
E 2. JFrame erkennt 1. Frame Java Basics - Anfänger-Themen 6
C Bild ins Frame laden und Objekte drüber legen Java Basics - Anfänger-Themen 1
R File chooser Dateien in frame anzeigen lassen Java Basics - Anfänger-Themen 5
L bestimmten Frame anzeigen lassen? Java Basics - Anfänger-Themen 6
H Textfeldinhalt löschen nachdem Frame geschlossen wird Java Basics - Anfänger-Themen 8
L Kalender Java Frame Java Basics - Anfänger-Themen 7
A Frame Java Basics - Anfänger-Themen 3
P Verwirrung mit AWT Frame und main Methode Java Basics - Anfänger-Themen 19
A Frame java Java Basics - Anfänger-Themen 3
D Frame schließt gleich alle Frames Java Basics - Anfänger-Themen 5
T udp -> bytearray -> image -> ausgabe via frame Java Basics - Anfänger-Themen 6
J Erste Schritte Speichern / Speichern unter / title Frame Java Basics - Anfänger-Themen 5
F Frame in Frame Java Basics - Anfänger-Themen 3
U GUI - resize frame Java Basics - Anfänger-Themen 13
J Open reading Frame Java Basics - Anfänger-Themen 4
J Erstelltes Frame wird nicht angezeigt Java Basics - Anfänger-Themen 2
K Frame öffnen klappt nicht?! Java Basics - Anfänger-Themen 36
JAVAnnik Anwendung nach Schließen vom letzen Frame Java Basics - Anfänger-Themen 9
B Referenz zu anderen Frame Java Basics - Anfänger-Themen 10
A Frame Background Java Basics - Anfänger-Themen 21
S Klassen Klassenname = Frame? Java Basics - Anfänger-Themen 11
R Eingefärbtes Panel wird in Frame nicht angezeigt Java Basics - Anfänger-Themen 10
I Java - Text in neuem Frame wird nicht angezeigt Java Basics - Anfänger-Themen 4
M Frame mit mehreren areas Java Basics - Anfänger-Themen 14
B Frame über Button öffnen Java Basics - Anfänger-Themen 8
R Button soll neuen Frame öffnen Java Basics - Anfänger-Themen 21
L Variablen Frame Variablen-Schleife Java Basics - Anfänger-Themen 3
D Neues Frame öffnen Java Basics - Anfänger-Themen 7
V Frame bleibt grau Java Basics - Anfänger-Themen 5
G Polygon in Frame zeichnen Java Basics - Anfänger-Themen 3
F frame wird nicht angezeigt? Java Basics - Anfänger-Themen 10
S 2 Panels in einen Frame Java Basics - Anfänger-Themen 5
H Panels in Frame einbinden Java Basics - Anfänger-Themen 3
E Frame neu Zeichnen Java Basics - Anfänger-Themen 3
A Bild wird auf Frame nicht angezeigt! Keine Fehlermeldung Java Basics - Anfänger-Themen 3
O Grafik in Frame laden Java Basics - Anfänger-Themen 9
T Frame öffnen Java Basics - Anfänger-Themen 6
I 1 Frame und mehrere Panels klappt nicht Java Basics - Anfänger-Themen 4
I JTable in bestehenden Frame integrieren Java Basics - Anfänger-Themen 6
Y Hilfe: JOGL / OPENGL in Frame Java Basics - Anfänger-Themen 2
J Frame schließen, Ereignis behandeln, Vorgang abbrechen Java Basics - Anfänger-Themen 4
Luk10 Frame schließen Java Basics - Anfänger-Themen 2
A Frame schließen!? Help! Java Basics - Anfänger-Themen 5
A Frame reagiert nicht Java Basics - Anfänger-Themen 6
H Modalen JDialog schließen, ohne dabei das Parent-Frame zu schließen Java Basics - Anfänger-Themen 7
J Frame bleibt schwarz beim Laden Java Basics - Anfänger-Themen 11
ModellbahnerTT Unterschied zwischen zwei Frame close Varianten Java Basics - Anfänger-Themen 3
R Frame Inhalt ausrichten Java Basics - Anfänger-Themen 5
MisterSeven Java Swing - Wie Frame größe festlegen?! Java Basics - Anfänger-Themen 10
E Verständnisfrage Syntax: frame.getContentPane().add(button) Java Basics - Anfänger-Themen 11
Stillmatic1985 Label in einem Frame zentrieren Java Basics - Anfänger-Themen 4
A Grafik erstellen und in Frame einfügen Java Basics - Anfänger-Themen 17
A Java Frame per X schließen? Java Basics - Anfänger-Themen 7
H2SO3- image beim awt frame wegmachen Java Basics - Anfänger-Themen 2
kulturfenster Panel in Frame integrieren Java Basics - Anfänger-Themen 5
kulturfenster Per Button Frame schliessen Java Basics - Anfänger-Themen 2
C Frame, JFrame, JDialog Java Basics - Anfänger-Themen 12
I JButton zum frame schließen Java Basics - Anfänger-Themen 6
M Variable in Frame anzeigen Java Basics - Anfänger-Themen 11
O Beim Schließen JDialog, im Frame-Owner eine Methode starten Java Basics - Anfänger-Themen 6
hdi Desktop-Auflösung abfragen -> setLocation() von Frame Java Basics - Anfänger-Themen 5
hdi keylistener hat keinen fokus oder: listener ohne frame? Java Basics - Anfänger-Themen 10
S Übergabe von Frame-Objekt - kritisch? Java Basics - Anfänger-Themen 7
N Frame in Frame erstellen Java Basics - Anfänger-Themen 2
B Java-Frame Taschenrechner - String -> Int und umgekehrt Java Basics - Anfänger-Themen 8
G Bild wird im falschen Frame angezeigt Java Basics - Anfänger-Themen 5
G Frame soll Focus behalten Java Basics - Anfänger-Themen 2
H Frame schließen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben