Schrittweises abändern des GUI während for-Schleife / pausieren einer for-Schleife

DorFey

DorFey

Mitglied
Hallo Leute!

Ich habe mich an folgendem versucht:

Vokabelquiz erstellen mit 6 Antwortmöglichkeiten.

Kurzbeschreibung:

Richtige Vokabelpaare (n Paare) sind in Array gespeichert,
z.B.: verb (deutsch) = verbArr[n][0], verb (fremdsprache) = verbArr [n][1]

Ein zweites Array enthält den Platz der richtigen Antwort (zahlen 1 bis 6 wird jedem Button zugeordnet, 1==richtig, 2-6==falsch)
Dieses Array enthält alle möglichen 720 Permutationen der Zahlen 1 bis 6. => numArr [720][6].

Z.B:
numArr [2][0]=3
numArr [2][1]=4
numArr [2][2]=1
numArr [2][3]=5
numArr [2][4]=6
numArr [2][5]=2

Für das 3. Vokabelpaar liegt der richtige Wert somit am 3. Button.

Zu erratender Begriff ist immer der nächste Index w -> verbArr [w][0]
1 Button erhält (siehe numArray) = verbArr [w][1] = richtigen Werten, andere 5 Buttons erhalten zufällige Werte aus einem Teilbereich der Gesamtmenge (wobei immer nur jener Teil dafür herangezogen wird, wo nicht das richtige i liegt).

Folgende Problemstellung:
Ich habe eine for-Schleife aufgesetzt, welche das Ziel haben sollte nach jedem Schleifendurchlauf folgendes zu tun:

- Buttons einfärben (grün-richtig / rot-falsch) je nach gegebener Antwort
- Schleifendurchlauf für 500ms unterbrechen über Thread.sleep().
- Buttons auf Standardfarbe weiß zurückfärben und Buttons mit neuen Begriffen hinterlegen
- Buttons über setText mit neuen Werten belegen (das habe ich nicht mehr versucht einzubauen)

Aber:

Die for-Schleife läuft alle 720 Schleifendurchläufe durch und ändert anschließend das UI einmalig ab.
(Schleife wartet nicht auf Click, sondern rennt einfach durch). Habe versucht mir den aktuellen index über setText auf den 6. Button darzustellen und mir wurde
immer der letzte Arraywert angezeigt).

Thread.sleep(ms: 500) hilft auch nicht -> Programm macht dann einmalig 500ms * 720 Pause und friert das UI für diesen Zeitraum.
Ziel wäre gewesen 500ms warten -> UI Buttons zurückfärben -> auf Buttonclick warten -> UI Buttons rot/grün -> 500ms Pause etc.
Sodass die Änderung im UI schrittweise passiert.

Bei stackoverflow habe ich bei einem ähnlichen Problem gelesen:

1602437094335.png


Ich gehe davon aus, dass das unterbrechen und der spätere restart der for-Schleife per Buttonclick somit nur bedingt möglich ist und einen ganz anderen Lösungsansatz braucht?

Unten findet ihr den betreffenden Code-Ausschnitt:

Java:
.... 

private void threadCatcher(){
    try {
        Thread.sleep(500);
    } catch (InterruptedException ie) {
        Thread.currentThread().interrupt();
    }
}

// 

button_weiter.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

button_verb1.setOnClickListener(this);
button_verb2.setOnClickListener(this);
button_verb3.setOnClickListener(this);
button_verb4.setOnClickListener(this);
button_verb5.setOnClickListener(this);
button_verb6.setOnClickListener(this);

for (int w = 0; w<720; w++){

                    if(numArr[w][0]==1){

                        switch (view.getId()) {
                            case R.id.button_verb1:
                                button_verb1.setBackground(getResources().getDrawable(R.drawable.my_button_main_true));
                                threadCatcher();
                                button_verb6.setText(String.valueOf(w));
                        
                            case R.id.button_verb2:
                                button_verb1.setBackground(getResources().getDrawable(R.drawable.my_button_main_true));
                                button_verb2.setBackground(getResources().getDrawable(R.drawable.my_button_main_false));
                                threadCatcher();
                                button_verb6.setText(String.valueOf(w));
                    
                            case R.id.button_verb3:
                                button_verb1.setBackground(getResources().getDrawable(R.drawable.my_button_main_true));
                                button_verb3.setBackground(getResources().getDrawable(R.drawable.my_button_main_false));
                                threadCatcher();
                                button_verb6.setText(String.valueOf(w));

                            case R.id.button_verb4:
                                button_verb1.setBackground(getResources().getDrawable(R.drawable.my_button_main_true));
                                button_verb4.setBackground(getResources().getDrawable(R.drawable.my_button_main_false));
                                threadCatcher();
                                button_verb6.setText(String.valueOf(w));

                            case R.id.button_verb5:
                                button_verb1.setBackground(getResources().getDrawable(R.drawable.my_button_main_true));
                                button_verb5.setBackground(getResources().getDrawable(R.drawable.my_button_main_false));
                                threadCatcher();
                                button_verb6.setText(String.valueOf(w));

                            case R.id.button_verb6:
                                button_verb1.setBackground(getResources().getDrawable(R.drawable.my_button_main_true));
                                button_verb6.setBackground(getResources().getDrawable(R.drawable.my_button_main_false));
                                threadCatcher();
                                button_verb6.setText(String.valueOf(w));
                            }}

                            else if(shuffleNumArr[w][0]==2){

                                switch (view.getId()) {
                                    case R.id.button_verb1:
                                        button_verb1.setBackground(getResources().getDrawable(R.drawable.my_button_main_false));
                                        button_verb2.setBackground(getResources().getDrawable(R.drawable.my_button_main_true));
                                        threadCatcher();
                                        button_verb6.setText(String.valueOf(w));

                                    case R.id.button_verb2:
                                        button_verb2.setBackground(getResources().getDrawable(R.drawable.my_button_main_true));
                                        threadCatcher();
                                        button_verb6.setText(String.valueOf(w));

                                    case R.id.button_verb3:
                                        button_verb2.setBackground(getResources().getDrawable(R.drawable.my_button_main_true));
                                        button_verb3.setBackground(getResources().getDrawable(R.drawable.my_button_main_false));
                                        threadCatcher();
                                        button_verb6.setText(String.valueOf(w));

                                    case R.id.button_verb4:
                                        button_verb2.setBackground(getResources().getDrawable(R.drawable.my_button_main_true));
                                        button_verb4.setBackground(getResources().getDrawable(R.drawable.my_button_main_false));
                                        threadCatcher();
                                        button_verb6.setText(String.valueOf(w));

                                    case R.id.button_verb5:
                                        button_verb2.setBackground(getResources().getDrawable(R.drawable.my_button_main_true));
                                        button_verb5.setBackground(getResources().getDrawable(R.drawable.my_button_main_false));
                                        threadCatcher();
                                        button_verb6.setText(String.valueOf(w));

                                    case R.id.button_verb6:
                                        button_verb2.setBackground(getResources().getDrawable(R.drawable.my_button_main_true));
                                        button_verb6.setBackground(getResources().getDrawable(R.drawable.my_button_main_false));
                                        threadCatcher();
                                        button_verb6.setText(String.valueOf(w));
                                    }}
    
    // ETC weiter so für alle 6 Buttons

Freu mich über alle Anregungen.
Liebe Grüße
 
kneitzel

kneitzel

Top Contributor
Du Karteireiter im sogenannten UI Thread und blockiertes diesen. Damit die Änderungen sichtbar werden, muss aber das Fenster neu gemalt werden, was ebenfalls im UI Thread statt findet.

Daher wäre hier mein Lösungsvorschlag die Verwendung eines Timers, der Veränderungen anstößt. Dann hättest du z.B. Einen Timer, der alle x ms schauen soll, ob etwas geändert werden soll und dies dann ausführt.
Oder du erstellst einen neuen Thread (z.B. mit SwingWorker) und kannst da dann mit den sleep Aufrufen nur diesen Thread pausieren.

Schau Dir zu dieser Thematik z.B. http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_026.htm an.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Hat nicht direkt was mit dem Problem zu tun, aber über diese Nutzung von Arrays sollte man schon lange hinaus sein, wenn man was mit GUIs macht. Das ganze kann man deutlich besser mit vernünftigen Objekten umsetzen, das merkwürdige if-else-switch-Konstrukt wird man damit auch los.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Schrittweises Zeichnen Java Basics - Anfänger-Themen 3
W Wie kann man folgenden Code abändern, dass er den Score mit Zahl anzeigt? Java Basics - Anfänger-Themen 3
F HTML Datei in .jar speichern und abändern Java Basics - Anfänger-Themen 2
W Java Programm abändern Java Basics - Anfänger-Themen 6
G Methode abändern, aber wie? Java Basics - Anfänger-Themen 3
A Haben KNNs ein Gedächtnis, lernen etwas oder verändern sich, während sie nicht trainieren, aber aktiv sind? Java Basics - Anfänger-Themen 3
S NullPointerException während ResultSet Java Basics - Anfänger-Themen 7
UnknownInnocent Klassen mouseClicked wird nicht aufgerufen, während man die Maus bewegt Java Basics - Anfänger-Themen 4
U Ausgabe von Dateiinhalt während Programmnutzung fehlerhaft Java Basics - Anfänger-Themen 3
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
C Instanz einer Klasse während if-Abfrage erzeugen und bei zweiter if-Abfrage wiederverwenden Java Basics - Anfänger-Themen 6
R Einfaches refresh während runtime Java Basics - Anfänger-Themen 4
W Klassen [GELÖST] Objekte während der Laufzeit mit neuen veränderten Werten beliebig oft initialisieren Java Basics - Anfänger-Themen 2
E Gui updaten während langer Methode Java Basics - Anfänger-Themen 2
O JList aktualisieren während Dateieinlesung Java Basics - Anfänger-Themen 4
C Datei speichern während sie geöffnet ist Java Basics - Anfänger-Themen 4
llabusch Interface Layout eines Labels während der Laufzeit ändern Java Basics - Anfänger-Themen 0
R Variablen Datentyp erst während Laufzeit festlegen Java Basics - Anfänger-Themen 6
O Starte Timer, während anderer Timer noch läuft. Ruft dies Schwierigkeiten hervor? Java Basics - Anfänger-Themen 0
M Löschen von Objekten während Iteration über Liste Java Basics - Anfänger-Themen 9
J Ladebalken anzeigen während Bilder geladen werden Java Basics - Anfänger-Themen 2
C repaint wird nicht während Druck auf Maustaste ausgeführt. Java Basics - Anfänger-Themen 4
E Input/Output Inputstream während der Laufzeit füllen Java Basics - Anfänger-Themen 2
B Threads Interrupt während Socket.read()? Java Basics - Anfänger-Themen 3
M Während event einen anderen event ausführen?? Java Basics - Anfänger-Themen 3
C Referenz einer bereits instanziierten Klasse während des Programmablaufs Java Basics - Anfänger-Themen 16
B Klassen Objekte während der Laufzeit dynamisch anlegen Java Basics - Anfänger-Themen 8
Nic.o Panel während Ladevorgang einblenden Java Basics - Anfänger-Themen 12
alderwaran objekthierarchie darstellen während der laufzeit Java Basics - Anfänger-Themen 2
M Timer: period während Verlauf wechseln Java Basics - Anfänger-Themen 12
M args[] während des Programmlaufes eingeben Java Basics - Anfänger-Themen 5
A Exception Verständnisfrage: Exceptions während, einer Statischenzuweisung abfangen Java Basics - Anfänger-Themen 10
B Collection während Iteration verändern Java Basics - Anfänger-Themen 7
B Während Schleife nicht auf Eingabe warten Java Basics - Anfänger-Themen 2
G JProgressBar während dem ausführen einer Funktion Java Basics - Anfänger-Themen 3
A Objekte während der Laufzeit erstellen Java Basics - Anfänger-Themen 3
C Textgröße während des Programmlaufes anpassen Java Basics - Anfänger-Themen 6
S JDialog während automatischer Dateisuche einblenden Java Basics - Anfänger-Themen 6
A Text einer JComboBox während der Laufzeit ändern ? Java Basics - Anfänger-Themen 4
S Boolean während while-schleife verändern? Java Basics - Anfänger-Themen 6
M Java Heap Space während der Laufzeit ändern Java Basics - Anfänger-Themen 2
M Problem beim ändern von Komponenten während Visible(true) Java Basics - Anfänger-Themen 4
G String im TextPane während der Eingabe überprüfen? Java Basics - Anfänger-Themen 12
A Code während des laufenden Programms eingeben Java Basics - Anfänger-Themen 7
P Javaquellcode während der Laufzeit einbinden Java Basics - Anfänger-Themen 18

Ähnliche Java Themen

Anzeige

Neue Themen


Oben