sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo afecta (rompe) Java para OS X 2013-004 a las aplicaciones Swing?

Actualización 2013-06-21:esta respuesta contiene algunas soluciones y alternativas que pueden ser útiles, pero la respuesta de @sidney-markowitz-biomatters contiene la corrección de código correcta:¡el LAF debe configurarse desde el hilo del evento!

Los problemas recientes parecen estar relacionados con las actualizaciones que rompen el Aqua Look and Feel (LAF), que es el predeterminado para las aplicaciones Swing en Mac OS X.

Si necesita el Aqua LAF, no hay demasiadas opciones. Es posible que deba esperar la próxima actualización de Java de Apple (supongo que solucionarán esto con prioridad, dado que es su propio LAF). También puede intentar usar Java Application Bundler (es decir, empaquetar Oracle JRE y evitar usar el JRE del sistema).

Si puede arreglárselas con un LAF diferente, entonces su aplicación debería funcionar normalmente. Lo hizo para PaperCut, al menos (la actualización 003 causó algunos problemas de enfoque de ventana, la actualización 004 causó caos).

Algunas opciones:

  • Usando el LAF multiplataforma específico de la versión de Java del código Java (por ejemplo, Nimbus o Metal):

    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName())
    
  • Configuración de un LAF específico desde código Java:

    UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel")
    
  • Anular el LAF predeterminado desde la terminal:

    java -Dswing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel MyApp
    

En nuestro caso, llamamos explícitamente a UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) en nuestro código y queríamos una solución alternativa que no implicara un cambio de código (es decir, una revisión), por lo que necesitábamos anular el sistema predeterminado LAF de la siguiente manera.

  • Anular el LAF del sistema desde la terminal:

    java -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel ...
    
  • Anulación del LAF del sistema desde un Info.plist archivo (si se ha incluido como una aplicación de Mac, también funciona para las otras opciones de VM) (por ejemplo, en My.app/Contents/Info.plist ).

    Desea agregar -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel hasta el final del <string> valor para VMOptions <key> . Las opciones están separadas por espacios, al igual que desde la terminal. P.ej. si ya tiene un useScreenMenuBar opción:

    <key>VMOptions</key>
    <string>-Dcom.apple.macos.useScreenMenuBar=true -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel</string>
    


Editar:@trashgod pidió un ejemplo reproducible. No estoy seguro de cuál es el alcance completo de los problemas con la actualización 004, pero aquí hay una reproducción simple:

Actualización 2013-06-21:de forma incorrecta, reproduciendo el error:

public class AquaLafTest {
    public static void main(String[] args) throws Exception {
        javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
        javax.swing.JOptionPane.showMessageDialog(null, "msg");
    }
}
  1. Ejecute con Apple JRE que viene con la actualización 004 (por ejemplo, en /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home ). Observe que el mensaje no está visible, el icono de diálogo no está visible y el botón no se puede hacer clic visiblemente.

  2. Ejecute con un Apple JRE más antiguo u otro JRE. Observe que el cuadro de diálogo se muestra como se esperaba.

Actualización 2013-06-21:la manera correcta, en el hilo del evento, funciona correctamente:

public class AquaLafTest {
    public static void main(String[] args) throws Exception {
        javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                try {
                    javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
                    javax.swing.JOptionPane.showMessageDialog(null, "msg");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}