Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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?
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).
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.
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.
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)
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.
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();
}
}
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.
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)