Aktionen verzögern

SteW

Mitglied
Java:
public void actionPerformed(ActionEvent ae) {
        if(ae.getSource() == this.Button1){
                Beschriftung1.setText("Die Spieldateien werden untersucht, bitte Gedulden sie sich einen Augenblick...");
                new Riot();
            }

Nun wird aber trotzdem zuerst "new Riot()" ausgeführt, jedoch will ich dass erst die Beschriftung geändert wird und dann "new Riot()" startet. Wie kann ich das machen?
 

KaffeeFan

Bekanntes Mitglied
was soll Riot denn überhaupt sein? etwas mehr informationen wären nicht schlecht.
grundsätzlich könntest du dein vorhaben in einen thread packen und thread.sleep(1000) aufrufen(1000 = 1sek).

gruß
luk
 

SteW

Mitglied
Um es einfach auszudrücken: Riot kopiert alle Dateien aus einem Ordner B in einen anderen Ordner A, in dem die Dateien benötigt werden. Und da dieser Kopiervorgang etwas andauert möchte ich, dass der Text umgeändert wird in "Die Spieldateien werden untersucht, bitte Gedulden sie sich einen Augenblick...", damit der Anwender weiß, dass das Programm arbeitet.
 

SteW

Mitglied
Drücke ich den Button wird dieser während des Kopiervorgangs dunkel unterlegt, als würde man den Button die ganze Zeit gedrückt halten. Erst wenn der Kopiervorgang abgeschlossen ist, sieht der Button wieder normal aus und dann ändert sich der Text. Also die Reihenfolge ist gerade anders herum wie ich sie gerne hätte.
 

KaffeeFan

Bekanntes Mitglied
was ist denn beschriftung1(variablennamen sollten übrigens immer klein geschrieben werden)?
ruf nach dem setText doch mal ein repaint() u. revalidate() auf, damit aktualisierst du deine gui bzw dein textfeld(falls es eins ist)

gruß
luk
 

SteW

Mitglied
Habe grade alle Variablennamen geändert, danke. Beschriftung1 ist ein JLabel. Repaint() und revalidate() sind mir komplett neu, könntest du mir das an meinem Beispiel zeigen wie das geht? Dann könnte ich beispielsweise wenn der Kopiervorgang beendet ist noch beschriftung1 in "Überprüfung abeschlossen" ändern.
 

JCODA

Top Contributor
So frei aus dem Handgelenk:

Java:
public void actionPerformed(ActionEvent ae) {
        if (ae.getSource() == this.Button1) {
            Beschriftung1
                    .setText("Die Spieldateien werden untersucht, bitte Gedulden sie sich einen Augenblick...");

            Thread th = new Thread(new Runnable() {
                @Override
                public void run() {
                    new Riot();
                    Beschriftung1
                    .setText("Fertig!");                   
                }
            });
            th.start();
        }
    }
 

Kababär

Top Contributor
Von einer Antwort aus StackOverFlow (da ich mich mit Swing nicht auskenne)
Swing is event driven. All components work through the MVC pattern. You don't need to explicitly repaint it by hiding/showing in order to update it's representation on the screen.

You just do yourLabel.setText("your new text") and the new text will appear on the label.

Keep in mind that most GUI-updates (the setText is an exception) needs to be performed on the EDT, so use SwingUtilities.invokeLater etc if you're update is triggered by, say, a network message.

If you do structural changes to the GUI you'll have to revalidate()/repaint() though.
Heißt so viel wie, dass zum Update bzw. Neuzeichnen der GUI-Komponenten die Methoden revalidate bzw. repaint erforderlich sind.
Des Weiteren habe ich gelesen, dass Swing eine "monothread-Natur" hat und die Änderung einer GUI Komponente einen Aktion wie "onAction" erfordert.
Beispiel aus einem anderen Forum:
Code:
private void myNextMethod()
{
    int number1 = whateverGetsRandomNumbers.nextRandomIntBetween(1, 6);
    int number2 = whateverGetsRandomNumbers.nextRandomIntBetween(1, 6);
    someLabelOrOther.setText("Alea jacta est: " + number1);
    myOtherLabel.setText("Alea II jacta est: " + number2);
    moveCounter(number1 + number2);
    etc();
}
. . .
public void actionPerformed(ActionEvent evt)
{
    myNextMethod();
}

Versuch dies mal, falls die Lösung von
JCODA
nicht funktioniert, aber normalerweise sollte das klappen, auch wenn dir der Begriff Thread noch neu ist.
Ansonsten gibt es für Swing auch eine andere Invoke-Methode:
Code:
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        update(); //Methode, die das ändern deines JLabels beschreibt
    }});

Edit: Ohne jegliche Kenntnis über Swing habe ich hier einfach mal 3 verschiedene Lösungsansätze aus dem Internet gefischt und hier aufgelistet.
Wenn man mal etwas nicht versteht, ist es immer mal wieder sinnvoll, zu googlen. Denn gerade beim Programmieren gilt: Ich bin garantiert nicht der erste Programmierer, der dieses Problem hat.
 

Joose

Top Contributor
Das Problem ist das die Ausführung von Riot anscheinend etwas länger dauert (Dateien kopieren halt) und da du "setText" und "Riot" im selben Thread ausführst blockiert das Kopieren der Dateien das neuzeichnen der UI!

Lösung: Lagere das Kopieren in einen Extra Thread aus fertig! Damit sollte es auch keinen Aufruf von "repaint" oder "revalidate" erfordern.
Allgemein: Länger andauerende Operationen sollten niemals im UI Thread durchgeführt werden sondern ausgelagert werden. (wie es JCODA gezeigt hat zum Beispiel)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
DaCrazyJavaExpert Verschiede Aktionen der Datenbank getrennt durchführen Java Basics - Anfänger-Themen 4
M Windows Aktionen abfangen Java Basics - Anfänger-Themen 3
S Aktionen Zahlen zuweisen Java Basics - Anfänger-Themen 3
U Aktionen zwischen zwei Klassen: Bester Weg? Java Basics - Anfänger-Themen 10
F Buttons und Aktionen Java Basics - Anfänger-Themen 20
0 TicTacToe, Problem mit den Checkbox-Aktionen Java Basics - Anfänger-Themen 6
M Erneutes Ausführen bestimmter Aktionen (GoTo-Alternative) Java Basics - Anfänger-Themen 6
G Gleiche Aktionen verarbeiten (aber nur einmal Code)? Java Basics - Anfänger-Themen 2
G ActionListener - Aktionen vor/beim Schließen? Java Basics - Anfänger-Themen 9
G Aktionen auslösen, nach Klick auf "Blätter" eines Java Basics - Anfänger-Themen 2
V Aktionen für mehrere CheckBoxes Java Basics - Anfänger-Themen 4
G Maus+Tastatur aktionen simulieren? Java Basics - Anfänger-Themen 5
J Schleife verzögern mit Button Java Basics - Anfänger-Themen 14
D Codeablauf unabhängig verzögern Java Basics - Anfänger-Themen 2
C Wie am besten die Verarbeitung der Eingabe verzögern ? Java Basics - Anfänger-Themen 5
JeromeM90 do-while Schleife verzögern ? Java Basics - Anfänger-Themen 2
T for-Schleife durch sleep verzögern? Java Basics - Anfänger-Themen 1
E Wiedermal verzögern Java Basics - Anfänger-Themen 7
T Verzögern Java Basics - Anfänger-Themen 10
F repaint() - Methode verzögern lassen? Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben