Ereignisschlange in Java

maddos

Mitglied
Halo erstmal.
ich hab folgendes Problem:
Code:
private void jButtonStartSetupActionPerformed(java.awt.event.ActionEvent evt) {                                                  
        /* Deaktivierung und Aktivierung der Buttons in dieser Methode ist nur
         * für das Aussehen gut. Die Anwendung direkt nach dem Ausführen der
         * xml-Datei geschlossen werden, wenn man den deaktivierten close-Button
         * anklickt. Bevor dieser Klick ausgewertet wird, wird der close-Button
         * am Ende der Methode wieder aktiviert und die Anwendung wird geschlossen. ;-)
         */
        enableClose(false);
        enableStart(false);
        Object [] objects = getLogPanel().getObjects();
        for (Object o: objects) {
            try {
                runFile((File)o);
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        }
        Toolkit.getDefaultToolkit().beep();
        enableClose(true);
        enableStart(true);
    }

Das Problem ist, wenn ich während dieses Prozesses auf Button Close drücke, obwohl er auf setEnabled(flase) eingestellt ist, speichert Java diese Ereignis in Ereigniswartenliste und führt diese dann nach Durchlauf diese Methode. Und wie man sieht, steh am Ende setEnabled(true). Also wird diese dann Erfolgreich ausgeführt und Frame wird geschlossen. Wie kann ich das vermeiden? Muss ich irgendwie in Ereigniswartenliste von Java eingreifen, oder gibt es andere Möglichkeit.
 
Das Probelm besteht immernoch...

p.s. Wenn es irgendwas mit Formulierung unklar ist, dann sagt bescheid, ich versuche das umzuformulieren.
 
Leute also wirklich, wenn meine Problem nicht zu loesen ist, dann sagt mir wenigstens bescheid, damit ich weiter keine Zeit mehr verbringe, Loesungen zu suchen. 3 Tagen steht das schon hier und ich sehe noch keine einzige Antowrt. Ich waere sehr dankbar, wenn ich wenigstens ne Antwort kriege.
 
Hallo,

dein Problem ist einfach, dass du durch die "lange" Datei Operation den Event Dispatch Thread blockierst... Zeitaufwendige sollte man in einen anderen Thread verschieben. Dabei sollte man beachten dass Swing nicht Threda safe ist. Will man bestimmte Teile einer Swing UI aus einem anderen Thread heraus manipulieren muss man das indirekt über EventQueue.invokexxx(...) bzw. SwingUtilities.invokexxx(..) machen. Dies führt dann die (kurzen) Änderungen im EDT Thread aus.

Schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import javax.swing.JButton;
import javax.swing.JFrame;

/**
 * @author thomas.darimont
 * 
 */
public class LongOperationExample extends JFrame {

    JButton btn;

    public LongOperationExample() {
        super("LongOperationExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        btn = new JButton("Action");
        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                btn.setEnabled(false);
                Executors.newSingleThreadExecutor().execute(new Runnable() {
                    public void run() {
                        performTimeConsumingOperation();
                        btn.setEnabled(true);
                        
                        //bei größeren UI Manipulation an nicht threadsicheren Komponenten (beispielsweise update der innereinen einer JTable etc:
//                        EventQueue.invokeLater(new Runnable(){
//                            public void run() {
//                                manipulateTheUiInSomeWay();
//                            }
//                        });
                    }
                });
            }
        });
        
        add(btn);

        pack();
        setVisible(true);
    }

    private void performTimeConsumingOperation() {
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

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

Leute also wirklich, wenn meine Problem nicht zu loesen ist, dann sagt mir wenigstens bescheid, damit ich weiter keine Zeit mehr verbringe, Loesungen zu suchen. 3 Tagen steht das schon hier und ich sehe noch keine einzige Antowrt. Ich waere sehr dankbar, wenn ich wenigstens ne Antwort kriege.
Nur ruhig Blut... manche Leute haben auch noch was anderes zu tun ;-)

Gruß Tom
 
Danke man. Das Problem ist tatzächlich nicht so schwer. Aber ich habe über den Single Thread Executor nich gewusst. Cooles Ding :)
 
Zurück