Events verarbeiten während Schleife

groovemaster

Grünschnabel
Hallo,

ich bastle an einem Programm, das in java.awt.TextFields fortwährend neu berechnete Werte hineinschreibt. Dabei wird wohl bei jedem setText() ein TextEvent erzeugt, das aber nicht verarbeitet wird, da die Schleife, in der die Berechnung abläuft, eine stinknormale while-Schleife in einer stinknormalen Methode ist, also den Ausführungsfokus nicht abgibt. In der Folge läuft die EventQueue irgendwann über.
Ich rufe die setText()-Methoden aus der erwähnten while-Schleife auf; die zugehörige Methode ist Bestandteil des Frame-Objektes, das die TextFields beinhaltet. Ganz nebenbei blockiert die Schleife auch die Verarbeitung von anderen Events (z.B. gibt es da noch ein paar Buttons, deren Events natürlich auch "steckenbleiben").

Gibt es eine Möglichkeit, aus der Schleife heraus die Verarbeitung der EventQueue zu forcieren? Oder muss ich womöglich die Schleife in einen eigenen Thread packen?

Beste Grüße & Danke für eure Hilfe!
 
Hallo!

Bau in deiner while-Schleife einfach einen entsprechenden sleep ein...
Java:
/**
 * 
 */
package de.tutorials;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @author Thomas.Darimont
 * 
 */
public class ContinuousValueChangeExample extends Frame {

    TextField txt;

    Button btn;

    ExecutorService executorService;

    public ContinuousValueChangeExample() {
        super("ContinuousValueChangeExample");
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        txt = new TextField(20);
        btn = new Button("click me");
        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("XXX");
            }
        });

        executorService = Executors.newFixedThreadPool(3);
        add(txt, BorderLayout.CENTER);
        add(btn, BorderLayout.SOUTH);

        pack();
        setVisible(true);

        executorService.execute(new Runnable() {
            public void run() {
                while (true) {
                    txt.setText("" + Math.random());
                    try {
                        TimeUnit.MILLISECONDS.sleep(100L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new ContinuousValueChangeExample();
    }

}

Gruß Tom
 
Zurück