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:
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
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: