Probleme mit java7 modalen Dialogen auf Mac OSX konzentrieren

8

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:

  1. Wenn ein Dialogfeld geöffnet ist und setModal (true) ist, blockiert es den Inhalt des Hauptfensters. Wenn Sie jedoch irgendwo im Hauptfenster klicken, wird das Dialogfeld darunter angezeigt, sollte aber oben im Hauptfenster bleiben .
  2. Wenn der Dialog ein JTextInputField hat, erhält er auch dann keinen Fokus, wenn Sie darauf klicken.

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:

  1. Klicken Sie auf die Schaltfläche, um den Dialog zu öffnen. Danach klicke irgendwo in den grauen Bereich: Der Dialog geht unter das Browserfenster, sollte aber oben bleiben, oder?
  2. Klicken Sie auf die Schaltfläche, um den Dialog zu öffnen. Danach klicke auf das Textfeld des Dialogs und versuche etwas zu schreiben: Der Textdialog erhält keinen Fokus.

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.

    
Luis Gonçalves 05.09.2012, 09:41
quelle

9 Antworten

6

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%     
Benoit Connault 13.12.2012 14:12
quelle
1

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.

    
Guillaume Polet 05.09.2012 09:56
quelle
1
  • 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

  • eingeschlossen werden
  • kann Focus by JTextField#setText(JTextField#getText()) in invokeLater()

  • erzwingen
  • Es gibt einen Dialogfokus , einer der großen Workarounds von @camickr

mKorbel 05.09.2012 11:06
quelle
1

Ich bestätige, ich habe den gleichen Fehler mit einem alten Applet, das in JDK7 unter OS X läuft. Wie das Poster erwähnt, wird der Fehler nur mit dem Applet im Browser (ff) und nicht mit dem Appletviewer angezeigt.

    
Yves G. 25.09.2012 13:20
quelle
1

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.

    
user1757808 18.10.2012 23:18
quelle
1

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.

    
NINI 24.10.2012 10:05
quelle
0

Ich habe eine weitere Problemumgehung gefunden. Wenn JDialog von JavaScript aufgerufen wird, hat es einen Fokus.

  1. Erstellen Sie eine Applet-Methode, die einen Dialog
  2. anzeigt
  3. Rufen Sie diese Methode von JavaScript auf.

Hoffe, es hilft. Übrigens, Web-Start-Beispiele aus Java-Tutorial haben das gleiche Problem Ссылка

    
Tanya 25.10.2012 03:57
quelle
0

Ich möchte die obige Problemumgehung verwenden (um den Dialog über den Dialog zu öffnen), aber ohne einen Dialog zu zeigen. Hier ist ein Code für nicht sichtbaren Dialog.

%Vor%     
Amos N. 14.01.2013 09:27
quelle
0

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.

    
Endre Olah 11.03.2018 08:34
quelle