Warten-Dialog

thomy800

Erfahrenes Mitglied
Hallo

Ich habe ein Programm, wo zwischendurch viel berechnet werden muss. Daher möchte ich für den User ein kleines warte-Fensterchen anzeigen lassen. Dafür habe ich folgende Methode geschrieben:

Java:
class fenster extends JFrame {

//...

public void warten(String text,final Runnable r) {
        final JDialog dialog= new JDialog(this,"warten...",true);
        dialog.add(new JLabel(text));
        dialog.setSize(200,100);
        dialog.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        dialog.addWindowListener(
            new WindowAdapter() {
                public void windowClosing (WindowEvent event) {
                    if (JOptionPane.showConfirmDialog(dialog,
                        "wirklich den Vorgang abbrechen?","abbrechen?",
                        JOptionPane.YES_NO_OPTION)==0) {
                            //r unterbrechen
                            dialog.setVisible(false);
                        }
                }
            });
        dialog.setLocation(
            getLocation().x+(getSize().width-dialog.getSize().width)/2,
            getLocation().y+(getSize().height-dialog.getSize().height)/2);
        final JFrame parent=this;
        Runnable r1=new Runnable() {
            public void run() {
                try {EventQueue.invokeAndWait(r);}
                catch (Exception ex) {
                    JOptionPane.showMessageDialog(parent,ex.toString(),"Fehler",JOptionPane.ERROR_MESSAGE);
                }
                dialog.setVisible(false);
            }
        };
        Executors.newSingleThreadExecutor().execute(r1);
        dialog.setVisible(true);
    }

}

Dieser Methode wird ein Runnable übergeben, wo die rechenaufwendige Methode enthalten ist. Das Problem hierbei ist allerdings, dass die CPU-Auslastung auf 100% geht und daher der Dialog nicht richtig geladen wird. Das bedeutet, dass kein JLabel zu sehen ist und der Schließen-Button auf Klick erst reagiert, wenn die rechenaufwendige Methode fertig ist, man so also den Vorgang nicht abbrechen kann.
Weiß jemand, wie man das bewerkstelligen kann, ohne die übergebene Methode (über den Runnable) abändern zu müssen?
Außerdem, wie kann ich die Methode unterbrechen, ohne mit einem boolean arbeiten zu müssen, der dann in der Methode bei jedem Schritt getestet werden müsste?

mfG thomy
 
Zuletzt bearbeitet:
Naja, so könnte ich noch ein ani-GIF einfügen, was so ähnlich wie bei WIndows aussieht. Aber vor allem: man soll den Vorgang ja abbrechen können.
 
Hallo,

warum machst du eigentlich diesen Aufruf?
Code:
EventQueue.invokeAndWait(r);

Warum machst du es nicht direkt dem ExecuterService?

MFG

Sascha
 
Das Warten (EventQueue.invokeAndWait(r); ) habe ich gemacht, damit der Dialog, wenn die Aufgabe beendet ist, wieder geschlossen wird. Wie würdest du das machen?

mfG Thomy
 
Code:
Executors.newSingleThreadExecutor().execute(r);

Und den anderen Thread würde ich komplett weglassen.

MFG

Sascha
 
Für die, die das selbe Problem haben: ich habe endlich selber eine Lösung gefunden:

Java:
public void warten(final String text,final Runnable r) {
        final Frame parent=this;
        final JDialog dialog= new JDialog(parent,"warten...",true);
        final Thread wait=new Thread() {
            public void run() {
                r.run();
                dialog.setVisible(false);
            }
        };
        dialog.add(new JLabel(text));
        dialog.setSize(200,100);
        dialog.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        dialog.addWindowListener(
            new WindowAdapter() {
                public void windowClosing (WindowEvent event) {
                    if (JOptionPane.showConfirmDialog(dialog,
                        "wirklich den Vorgang abbrechen?","abbrechen?",
                        JOptionPane.YES_NO_OPTION)==0) {
                            wait.interrupt();
                            dialog.setVisible(false);
                        }
                }
            });
        dialog.setLocation(
            getLocation().x+(getSize().width-dialog.getSize().width)/2,
            getLocation().y+(getSize().height-dialog.getSize().height)/2);
        wait.start();
        dialog.setVisible(true);
    }
 
Danke, das ist natürlich auch eine gute Möglichkeit^^
Aber bei meinen Rechenaufgaben ist sowieso unbekannt wie lange es noch dauert und somit keine Fortschrittsanzeige möglich.
 
Zurück