Ich habe eine Swing-Anwendung validiert, die auf einem Applet für Mac OSX läuft.
Während dieser Überprüfung fand ich die folgenden Probleme mit den modalen Dialogen:
Also habe ich ein kleines Programm erstellt, um das Problem zu zeigen. Kannst du mir bitte helfen zu verstehen, was hier falsch ist?
%Vor%Verwenden Sie das obige, um eine .jar-Datei (test.jar) zu erstellen. Sobald dies erledigt ist, erstellen Sie eine HTML-Datei mit folgendem Inhalt:
%Vor%Wenn dies erledigt ist, führen Sie die HTML-Datei aus. Sie sehen ein Applet mit einem grauen Hintergrund und einer Schaltfläche. Dann versuche es:
Also, was mache ich hier falsch? Kann das bitte jemand mit einem Mac-Computer testen?
Danke
Spezifikationen:
%Vor%HINWEIS: Bitte beachten Sie, dass dies nur geschieht, wenn das Applet im Browser und nur auf Mac OSX ausgeführt wird.
Ich habe eine andere Problemumgehung gefunden. Wenn das Fenster geöffnet ist, zeigen Sie ein Optionsfenster für einige Millisekunden und schließen Sie es. Es gibt den Fokus auf die Optionspane und dann zurück zum Dialog, um den Fehler zu ignorieren.
Fügen Sie dieses Code-Snippet zu Ihrem Dialogkonstruktor hinzu und es sollte funktionieren:
%Vor% Sie sollten ein "Besitzer" -Fenster auf Ihrem ModalDialog platzieren. Dazu müssen Sie in Ihrem ModalDialog-Konstruktor super (Eigentümer) aufrufen und das übergeordnete Fenster Ihrer Komponente parent
mit SwingUtilities.getWindowAncestor(parent)
abrufen.
Nicht Mac / OSX-Benutzer, aber dies ist ein häufiges Problem bei Focus
und JDialog
,
Es gibt ein anderes Problem, wenn JDialog
in Runtime erstellt wird,
Focus
ist asynchron basierend auf den Eigenschaften von Native OS
Erstellen Sie dieses JDialog
nur einmal und re_use
this container
für eine andere Aktion
JDialog#setVisible
sollte in invokeLater()
zu
kann Focus
by JTextField#setText(JTextField#getText())
in invokeLater()
Es gibt einen Dialogfokus , einer der großen Workarounds von @camickr
Ich kann bestätigen, dass dies ein Problem für Java 1.7 Update 7+ auf Safari 6 und Firefox auf Mountain Lion ist. Seltsamerweise ist es kein Problem in früheren Versionen von Safari, die auf Lion laufen, aber es ist ein Problem in Firefox auf dem älteren Betriebssystem. Ich bin ziemlich verzweifelt, um eine Lösung dafür zu finden, da einige meiner Applet-Benutzer auf Macs sind. Eine Problemumgehung, die ich gefunden habe (die auf keinen Fall ausreichend ist), besteht darin, das Fenster zu verkleinern und dann wieder zu öffnen. Die textfields / textareas können dann bearbeitet werden. Hoffentlich können wir eine bessere Lösung finden, die diese lästige Anforderung umgeht.
Ich habe das gleiche Problem auf Mac mit Java 7 Update 9 mit Safari und Firefox erlebt. Als ich einen JDialog öffnete, der ein JTextField enthielt, war das JTextField nicht zugänglich.
Ich habe eine Lösung gefunden. Ich habe eine Verzögerung eingefügt, als der Benutzer den "show dialog button" gedrückt hat, um den Code auszuführen, der die Schaltfläche anzeigt.
Zum Beispiel:
%Vor%Ich habe festgestellt, dass die Lösung nicht funktionieren würde, wenn die Verzögerung zu kurz wäre.
Wenn man SwingUtilities.invokeLater
anstelle von javax.swing.Timer
benutzt, wird es nicht funktionieren. Vielleicht ist die Verzögerung von SwingUtilities.invokeLater
zu kurz.
Ich habe eine weitere Problemumgehung gefunden. Wenn JDialog von JavaScript aufgerufen wird, hat es einen Fokus.
Hoffe, es hilft. Übrigens, Web-Start-Beispiele aus Java-Tutorial haben das gleiche Problem Ссылка
Ich habe eine Lösung gefunden.
%Vor%GetDirectory ist JDialog mit einem JFileChooser.
Das seltsame Ding ist, dass alle JDialog-Objekte mit dem neuen JFrame () als Parent aufgerufen werden sollten, sonst wird das oberste modale JDialog in der zOrder rückwärts und irgendwie kann es nicht mehr oben gesetzt werden.
Mein Problem war das gleiche wie oben. Wenn ich den JDialog von einem anderen JDialog aus erstellt habe, erschien der neue Dialog hinter dem anderen.
Um es nach oben zu bringen, habe ich die Eltern aller JDialogs wie oben beschrieben festgelegt und es hat entsprechend den Erwartungen funktioniert.
Tags und Links java macos swing modal-dialog applet