Nixaja Geschrieben 4. März 2005 Geschrieben 4. März 2005 Servus... während einer langen Wartezeit brauche ich einen Cursor, der nicht nur die Sanduhr anzeigt (ist in Java sowieso net sooo ... dauerhaft ), sondern auch deaktiviert wird. Der Cursor soll für eine angegebene Zeitspanne auf keine Klicks mehr in einem angegebenen Fenster reagieren. Ich wäre schon mit einem Lösungsansatz zufrieden... :confused: Vielen Dank und liebe Grüße Nixaja Zitieren
Krain Geschrieben 4. März 2005 Geschrieben 4. März 2005 Wie wäre es mit einem modalen Fenster, welches einen "Warten"-Dialog anzeigt und sich nach Beendigung der Berechnung selbst schließt? Dadurch ist der Zugriff auf die darunterliegenden Komponenten ja gesperrt und somit auch kein Zugriff darauf möglich. Man muss nur nach der Berechnung darauf achten, den Dialog wieder zu schließen. Das würde mir auf Anhieb einfallen. gruss markus Zitieren
perdian Geschrieben 4. März 2005 Geschrieben 4. März 2005 Der Cursor soll für eine angegebene Zeitspanne auf keine Klicks mehr in einem angegebenen Fenster reagieren. Der Cursor reagiert sowieso nicht auf irgendwelche Clicks... der ist sozusagen nur die visuelle Bestätigung, wo denn gerade die Aktion auf dem Window statt findet. Reagieren tun nur die Komponenten selber - und genau hier musst du auch ansetzen, wenn du etwas sperren willst. Soll ein Fenster keine Clicks, etc. mehr behandeln, so musst du auch alle Komponenten, die in diesem Fenster sitzen deaktivieren. Als Beispiel in etwa sowas: public class TestClass { public void actionPerformed(ActionEvent e) { // Make components inaccessible JButton button1 = this.getButtonFromSomewhere(); JTextField field1 = this.getTextFieldFromSomewhere(); button1.setEnabled(false); field1.setEnabled(false); // Perform action try { this.doStuff(); } finally { // Ensure, that all components are visible again button1.setEnabled(true); field1.setEnabled(true); } } } Um den Cursor selber zu ändern, so gilt auch hier: An den Cursor allgemein kommst du nicht ran. Du kannst nur einer Komponente sagen "Wenn der Cursor über dir ist, dann verwende Form XYZ. Auch hier wieder ein Beispiel: public class TestClass { public void actionPerformed(ActionEvent e) { // Install a hand cursor, if the mouse moves over the current button JButton button = this.getButtonFromSomewhere(); Cursor handCursor = new Cursor(Cursor.HAND_CURSOR); button.setCursor(handCursor); } } Zitieren
Nixaja Geschrieben 4. März 2005 Autor Geschrieben 4. März 2005 Der Cursor reagiert sowieso nicht auf irgendwelche Clicks... der ist sozusagen nur die visuelle Bestätigung, wo denn gerade die Aktion auf dem Window statt findet. Reagieren tun nur die Komponenten selber - und genau hier musst du auch ansetzen, wenn du etwas sperren willst. Das Problem ist, dass ich eben diese Cursor Klicks nicht abfangen kann... Wenn das Fenster arbeitet, reagiert es immer noch auf die Minimieren/Deminimieren Buttons. Erst nach der Abarbeitung werden meine zugehörigen Handle Events aufgerufen. Ich habs mir jetzt so gedacht: Während einer Verarbeitung sperre ich das komplette Fenster. Dann wird auch die Header Leiste des Fensters nicht mehr angesprochen. Leider wird nun auf keine Cursor Verformungen mehr reagiert... also keine Sanduhr... :cool: @ Krain Ein modales Wartefenster ist ansich eine gute Idee. Allerdings können unter dem momentan bearbeiteten Fenster noch mehrere "Eltern" Fenster liegen, die ebenfalls nicht beachtet werden dürfen... Mehr als das aufrufende Fenster zu disablen macht das modale Fenster ja nicht, oder? Zitieren
perdian Geschrieben 4. März 2005 Geschrieben 4. März 2005 Wenn das Fenster arbeitet, reagiert es immer noch auf die Minimieren/Deminimieren Buttons. Erst nach der Abarbeitung werden meine zugehörigen Handle Events aufgerufen. Ich habe gerade mal ein bisschen rumgespielt und bin in meiner ursprünglichen Meinung bestätigt worden: Es scheint generell keine Möglichkeit zu geben, das Minimieren/Maximieren zu verhindern. Du kannst mitbekommen, wann es passiert aber kannst nicht beeinflussen _ob_ es passiert. Was mir als Alternative einfallen würde: Lass einfach die Titelleiste komplett weg. Erzeuge dein Fenster entweder über ein JWindow oder verwende bei JFrame/JDialog setUndecorated(true). In Kombination mit setAlwaysOnTop(true) erhälst du so ein Fenster, das auf jeden Fall im Vordergrund beim User ist, und das er nicht wegklicken kann. Ich habs mir jetzt so gedacht: Während einer Verarbeitung sperre ich das komplette Fenster. Dann wird auch die Header Leiste des Fensters nicht mehr angesprochen. Leider wird nun auf keine Cursor Verformungen mehr reagiert... also keine Sanduhr... :cool: Naja dann musst du entweder den von mir oben beschriebenen Weg gehen, oder du machst dem User innerhalb des Frames klar, dass eine Aktion in Bearbeitung ist, durch eine Sanduhr als animiertes GIF, eine ProgressBar oder ähnliches. Zitieren
Krain Geschrieben 4. März 2005 Geschrieben 4. März 2005 @ Krain Ein modales Wartefenster ist ansich eine gute Idee. Allerdings können unter dem momentan bearbeiteten Fenster noch mehrere "Eltern" Fenster liegen, die ebenfalls nicht beachtet werden dürfen... Mehr als das aufrufende Fenster zu disablen macht das modale Fenster ja nicht, oder? Aber wenn du das modale Fenster von deinem Root-Fenster aus abschickst sind doch alle darunterliegenden gesperrt. Oder handelt es sich um unterschiedliche Anwendungen, auf die Du den Zugriff verweigern willst. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.